Skip to main content

Full text of "intel :: 8085 :: 9800301C 8080 8085 Assembly Language Programming Manual Nov78"

See other formats


8080/8085 ASSEMBLY LANGUAGE 
PROGRAMMING MANUAL 



Order Number 9800301 C 



Copyright® 1977, 1978 Intel Corporation 
Intel Corporation, 3065 Bowers Avenue, Santa Clara, California 95051 f 



The information in this document is subject to change without notice. 

Intel Corporation mal<es no warranty of any kind with regard to this material, including, but not limited to, the implied 
warranties of merchantability and fitness for a particular purpose. Intel Corporation assumes no responsibility for any 
errors that may appear in this document. Intel Corporation makes no commitment to update nor to keep current the 
information contained in this document. 

The software described in this document is furnished under a license and may be used or copied only in accordance with 
the terms of such license. 

Intel Corporation assumes no responsibility for the use or reliability of its software on equipment that is not supplied by 
Intel. 

No part of this document may be copied or reproduced in any form or by any means without the prior written consent 
of Intel Corporation. 

The following are trademarks of Intel '.Corporation and may be used only to describe Intel products: 



ICE 30 
ICE- 48 
ICE- 80 

ICE 85 

INSITE 
INTEL 
INTELLEC 



LIBRARY MANAGER 

MCS 

MEGACHASSIS 

MICROMAP 

MULTIBUS 

PROMPT 

UPI 



PRINTED IN U.S.A./B-144/1178/15K/CP 



PREFACE 



This manual describes programming with Intel's assembly language. It will not teach you how to program a computer. 

Although this manual is designed primarily for reference, it also contains some instructional material to help the beginning 
programmer. The manual is organized as Follows: 

Chapter 1. ASSEMBLY LANGUAGE AND PROCESSORS 

Description of the assembler 

Overview of 8080 hardware and instruction set 

Description of 8080/8085 differences 

Chapter 2. ASSEMBLY LANGUAGE CONCEPTS 

General assembly language coding rules 

Chapter 3. INSTRUCTION SET 

Descriptions of each instruction (these arc listed alphabetically 
for quick reference) 

Chapter 4. ASSEMBLER DIRECTIVES 

Data definition 
Conditional assembly 
Relocation 

Chapter 5. MACROS 

Macro directives 
Macro examples 

Chapter 6. PROGRAMMING TECHNIQUES 

Programming examples 
Chapter 7. INTERRUPTS 

Description of the interrupt system. 

Chapters 3 and 4 will fill most of the experienced programmer's reference requirements. Use the table of contents or the 
index to locate information quickly. 

The beginning programmer should read Chapters 1 anc 2 and then skip to the examples in Chapter 6. As these examples 
I raise questions, refer to the appropriate information in Chapter 3 or 4. Before writing a program, you will need to read 
Chapter 4. The 'Programming Tips' in Chapter 4 are intended especially for the beginning programmer. 



Ill 



RELATED PUBLICATIONS 

To use your Inlcllcc development system effectively, you should be familiar v/ith the follov/ing Intel 
publications; 



ISIS-II 8080/8085 MACRO ASSEMBLER OPERATOR'S MANUAL, 9800292 

When you activate the assembler, you have the option of specifying a number of controls. The operator's 
manual describes the activation sequence fo:' the assembler. The manual also describes the debugging tools 
and the error messages supplied by the assembler. 



ISIS-II SYSTEM USER'S GUIDE, 9800306 

User programs arc commonly stored on diskette files. The ISIS-II User's Guide describes the use of the text 
editor for entering and maintaining programs. The manual also describes the procedures for linking and 
locating relocatable program modules. 



Hardware References 

For additional information about processors and their related components, refer to the appropriate User's 
Manual: 

8080 MICROCOMPUTER SYSTEMS USER'S MANUAL, 9800153 

8085 MICROCOMPUTER SYSTEMS USER'S MANUAL, 9800366 



IV 



TABLE OF CONTENTS 



Chapter 1. ASSEMBLY LANGUAGE AND PROCESSORS 1-1 

Introduction 1-1 

What Is An Assembler? 1-1 

What the Assembler Does 1-1 

Object Code 1-2 

Program Listing 1-2 

Symbol-Cross-Reference Listing 1-3 

Do You Need the Assembler? 1-3 

Overview of 8080/8085 Hardware 1-5 

Memory 1-5 

ROM 1-5 

RAM 1-5 

Program Counter 1-6 

Work Registers 1-7 

Internal Work Registers 1-9 

Condition Flags 1-9 

Carry Flag 1-10 

Sign Flag MO 

Zero Flag Ml 

Parity Flag Ml 

Auxiliary Carry Flag 1-11 

Stack and Stack Pointer 1-12 

Stack Operations 1"13 

Saving Program Status 1-13 

Input/Output Ports 1-14 

Instruction Set l-'5 

Addressing Modes 1-15 

Implied Addressing 1-15 

Register Addressing 1-15 

Immediate Addressing 1-15 

Direct Addressing 1-15 

Register Indirect Addressing 1-16 

Combined Addressing Modes 1-16 

Timing Effects of Addressing Modes 1-16 

Instruction Naming Conventions 1-16 

Data Transfer Group 1-16 

Arithmetic Group 1-1''' 

Logical Group 1-17 

Branch Group 1-18 

Stack, I/O, and Machine Control Instructions 1-19 

Hardware/Instruction Summary 1-19 

Accumulator Instructions 1-19 

Register Pair (Word) Instructions 1-21 

Branching Instructions 1-22 

Instruction Set Guide '-23 



8085 Processor Differences 1-24 

Programming for the 8085 1-24 

Conditional Instructions 1-25 

Chapter 2. ASSEMBLY LANGUAGE CONCEPTS 2-1 

Introduction 2-1 

Source Line Format 2-1 

Character Set 2-1 

Delimiters 2-2 

Label/Name Field 2-3 

Opcode Field 2-4 

Operand Field 2-4 

Comment Field 2-4 

Coding Operand Field Information 2-4 

Hexadecimal Data 2-5 

Decimal Data 2-5 

Octal Data 2-5 

Binary Data 2-5 

Location Counter 2-6 

ASCII Constant 2-6 

Labels Assigned Values 2-6 

Labels of Instruction or Date 2-6 

Expressions 2-6 

Instructions as Operands 2-7 

Register-Type Operands 2-7 

Two's Complement Representation of Data 2-7 

Symbols and Symbol Tables 2-9 

Symbolic Addressing 2-9 

Symbolic Characteristics 2-9 

Reserved, User-Defined, and Assembler-Generated Symbols .... 2-9 

Global and Limited Symbols 2-10 

Permanent and Redefinable Symbols 2-11 

Absolute and Relocatable Symbols 2-11 

Assembly-Time Expression Evaluation 2-11 

Operators 2-11 

Arithmetic Operators 2-12 

Shift Operators 2-12 

Logical Operators 2-13 

Compare Operators 2-13 

Byte Isolation Operators 2-14 

Permissible Range of Values 2-15 

Precedence of Operators 2-15 

Relocatable Expressions 2-16 

Chaining of Symbol Definitions 2-18 

Chapter 3. INSTRUCTION SET 3-1 

How to Use this Chapter 3-1 

Timing information 3-1 

Instructions are listed in alphabetical order 

vi 



Chapter 4. ASSEMBLER DIRECTIVES 4-1 

Symbol Definition 4-2 

'eQU Directive 4-2 

SET Directive 4-3 

Data Definition 4-3 

DB Directive 4-3 

DW Directive 4-4 

Memory Reservation 4-5 

DS Directive 4-5 

Programming Tips: Data Description and Access 4-6 

Random Access Versus Read Only Memory 4-6 

Data Description 4-6 

Data Access 4-6 

Add Symbols for Data Access 4-7 

Conditional Assembly 4-8 

IF, ELSE, ENDIF Directives 4-8 

Assembler Termination 4-10 

END Directive 4-10 

Location Counter Control and Relocation 4-11 

Location Counter Control (Non-Relocatable Mode) 4-11 

ORG Directive 4-11 

Introduction to Relocatability 4-12 

Memory Management 4-12 

Modular Program Development 4-12 

Directives Used for Relocation 4-14 

Location Counter Control (Relocatable Programs) 4-14 

ASEG Directive 4-14 

CSEG Directive 4-15 

DSEG Directive 4-15 

ORG Directive (Relocatable Mode) 4-16 

Program Linkage Directives 4-16 

PUBLIC Directive 4-17 

EXTRN Directive 4-17 

NAME Directive 4-18 

STKLN Directive 4-18 

STACK and MEMORY Reserved Words 4-19 

Programming Tips: Testing Relocatable Modules 4-19 

Initialization Routines 4-19 

Input/Output 4-20 

Remove Coding Used for Testing 4-20 

Chapter 5. MACROS ' 5-1 

Introduction to Macros 5-1 

Why Use Macros? 5-1 

What Is A Macro? 5-1 

Macros Vs. Subroutines 5-3 



VII 



Using Macros 5-3 

Macro Definition 5-3 

Macro Definition Directives 5-4 

MACRO Directive 5-4 

ENDM Directive 5-5 

LOCAL Directive 5-5 

REPT Directive 5-6 

iRP Directive 5-8 

IRPC Directive 5-8 

EXITM Directive 5-9 

Special Macro Operators 5-10 

Nested Macro Definitions 5-12 

Macros Calls 5-12 

Macro Call Format 5-12 

Nested Macro Calls 5-14 

Macro Expansion 5-15 

Null Macros 5-16 

Sample Macros 5-16 

Chapter 6. PROGRAMMING TECHNIQUES 6-1 

Branch Tables Pseudo-Subroutine 6-1 

Transferring Data to Subroutine 6-3 

Softv^arc Multiply and Divide 6-7 

Multibyle Addition and Subtraction 6-11 

Decimal Addition 6-12 

Decimal Subtraction 6-14 

Chapter 7. INTERRUPTS 7-1 

Interrupt Concepts 7-1 

Writing interrupt Subroutines 7-4 



Appendix A INSTRUCTION SUMMARY A-1 

Appendix B ASSEMBLER DIRECTIVE SUMMARY B-1 

Appendix C ASCII CHARACTER SET C-l 

Appendix D BINARY-DECIMAL-HEXADECIMAL CONVERSION TABLES D-1 



VIII 



LIST OF ILLUSTRATIONS 



Figure 

1-1 ASSEMBLER OUTPUTS 1-2 

1-2 COMPARISON OF ASSEMBLY LANGUAGE WITH PL/M 1-4 

1-3 8080/8085 INTERNAL REGISTERS 1-6 

1-4 INSTRUCTION FETCH 1-8 

1-5 EXECUTION OF MOV M.CINSTRUCTION 1-9 



IX 



1. ASSEMBLY LANGUAGE AND PROCESSORS 



INTRODUCTION 



Almost every line of source coding in an assembly language source program translates directly into a machine 
instruction for a particular processor. Therefore, the assembly language programmer must be familiar with both 
the assembly language and the processor for which he is programming. 

The first part of this chapter describes the assembler. The second part describes the features of the 8080 micro- 
processor from a programmer's point of view. Programming differences between the 8080 and the 8085 micro- 
processors are relatively minor. These differences are described in a short section at the end of this chapter. 



WHAT IS AN ASSEMBLER? 

An assembler is a software tool - a program - designed to simplify the task of writing computer programs. If 
you have ever written a computer program directly in a machine-recognizable form such as binary or hexadecimal 
code, you will appreciate the advantages of programming in a symbolic assembly language. 

Assembly language operation codes (opcodes) are easily remembered (MOV for move instructions, )MP for jump). 
You can also symbolically express addresses and values referenced in the operand field of instructions. Since you 
assign these names, you can make them as meaningful as the mnemonics for the instructions. For example, if your 
program rrust manipulate a date as data, you can assign it the symbolic name DATE. If your program contains a 
set of instructions used as a timing loop (a set of instructions executed repeatedly until a specific amount of time 
has passed), you can name the instruction group TIMER. 



What the Assembler Does 

To use the assembler, you first need a source program. The source program consists of programmer-written 
assembly language instructions. These instructions are written using mnemonic opcodes and labels as described 
previously. 

Assembly language source programs must be in a machine-readable form when passed to the assembler. The 
Intellec development system includes a text editor that will help you maintain source programs as paper tape 
files or diskette files. You can then pass the resulting source program file to the assembler. (The text editor is 
described in the ISIS-II System User's Guide.) 

The assembler program performs the clerical task of translating symbolic code into object code which can be 
executed by the 8080 and 8085 microprocessors. Assembler output consists of three possible files: the object 
file containing your program translated into object code; the list file printout of your source code, the assembler- 
generated object code, and the symbol table; and the symbol-cross-reference file, a listing of the symbol-cross- 
reference records. 



1-1 



Chapter 1. Assembly Language and Processors 



SOURCE 

PROGRAM 

FILE 



ASSEMBLER 



PROGRAM 





PROGRAM 
LISTING 



CROSS 

REFERENCE 

LISTING 



Figure 1-1. Assembler Outputs 



Object Code 



For most microcompuler applications, you probably will eventually load the object program into some form of 
read only memory. However, do not forget that the intellec development system is an 8080 microcomputer 
system with random access memory. In most cases you can load and execute your object program on the 
development system for testing and debugging. This allows you to test your program before your prototype 
application system is fully developed. 

A special feature of this assembler is that it allows you to request object code in a relocatable format. This frees 
the programmer from worrying about the eventual mix of read only and random access memory in the application 
system; individual portions of the program can be relocated as needed when the application design is final. Also, 
a large program can be broken into a number of separately assembled modules. Such modules are both easier to 
code and to test. See Chapter 4 of this manual for a more thorough description of the advantages of the relocation 
feature. 



Program Listing 

The program listing provides a permanent record of both the source program and the object code. The assembler 
also provides diagnostic messages for common programming errors in the program listing. For example, if you 
specify a 16-bit value for an instruction that can use only an 8-bit value, the assembler tells you that the value 
exceeds the permissible range. 



1-2 



Chapter 1. Assembly Lanauage and Processors 



Symbol-Cross-Reference Listing 

The symbol-cross-reference listing is anotlier of tine diagnostic tools provided by tine assembler. Assume, for 
example, that your program manipulates a data field named DATE, and that testing reveals a program logic 
error in the handling of this data. The symbol-cross-reference listing simplifies debugging this error because it 
points you to each instruction that references the symbol DATE. 



Do You Need the Assembler? 

The assembler is but one of several tools available for developing microprocessor programs. Typically, choosing 
the most suitable tool is based on cost restraints versus the required level of performance. You or your company 
must determine cost restraints; the required level of performance depends on a number of variables; 

• The number of programs to be v^ritten: The greater the number of programs to be written, the more 
you need development support. Also, it must be pointed out that there can be penalties for not 
writing programs. When your application has access to the power of a microprocessor, you may be 
able to provide customers with custom features through program changes. Also, you may be able to 
add features through programming. 

• The time allowed for programming: As the time allowed for programming decreases, the need for 
programming support increases. 

• The level of support for existing programs; Sometimes programming errors are not discovered until 
the program has been in use for quite a while. Your need for programming support increases if you 
agree to correct such errors for your customers. The number of supported programs in use can 
multiply this requirement. Also, program support is frequently subject to stringent time constraints. 

If none of the factors described above apply to your situation, you may be able to get along without the 
assembler. Intel's PROMPT -80, for example, allows you to enter programs directly into programmable read only 
memory. You enter the program manually as a string of hexadecimal digits. Such manual programming is relatively 
slow and more prone to human error than computer-assisted programming. However, manual systems are one of 
the least expensive tools available for microprocessor programming. Manual systems may be suitable for limited 
applications, hobbyists, and those who want to explore possible applications for microprocessors. 

If most of the factors listed previously apply to you, you should explore the advantages of PL/M. PL/M is 
Intel's high-level language for program development. A high-level language is directed more to problem solving 
than to a particular microprocessor. This allows you to write programs much more quickly than a hardware- 
oriented language such as assembly language. As an example, assume that a program must move five characters 
from one location in memory to another. The following example illustrates the coding differences between 
assembly language and PL/M. Since instructions have not yet been described, the assembly language instructions 
are represented by a flowchart. 



1-3 



Chapter ). Assembly Language and Processors 



ASSEMBLY LANGUAGE CODING 



LOAD REGISTER WITH NUMBER 
OF CHARACTERS TO BE MOVED 



LOAD REGISTER PAIR B WITH 
ADDRESS OF SOURCE (FLD1) 



LOAD REGISTER PAIR D WITH 
ADDRESS OF DESTINATION 
(FLD2) 



LOAD ACCUMULATOR WITH 1 
BYTE FROM SOURCE FIELD 



MOVE CHARACTER FROM 
ACCUMULATOR TO DESTINA- 
TION FIELD 



INCREMENT SOURCE ADDRESS 



INCREMENT DESTINATION 
ADDRESS 



DECREMENT CHARACTER COUNT 



NO 




\ 



> 



PL/M CODING 



CALL MOVE(5,FLD2,FLD1); 



C CONTINUE ^ 



Figure 1-2. Comparison of Assembly Language with PL/M 



1-4 



Chapter 1. Assembly Language and Processors 



OVERVIEW OF 8080/8085 HARDWARE 



To the programmer, the computer comprises, the following parts; 



Memory 

The program counter 

Work registers 

Condition flags 

The stack and stack pointer 

Input/output ports 

The instruction set 



Of the components listed above, memory is not part of the processor, but is of interest to the programmer. 



Memory 



Since the program required to drive a microprocessor resides in memory, all microprocessor applications require 
some memory. There are two general types of memory: read only memory (ROM) and random access memory 
(RAM). 



ROM 



As the name implies, the processor can only read instructions and data from ROM; it cannot alter the contents 
of ROM. By contrast, the processor can both read from and write to RAM. Instructions and unchanging data 
are permanently fixed into ROM and remain intact whether or not power is applied to the system. For this 
reason, ROM is typically used for program storage in single-purpose microprocessor applications. With ROM you 
can be certain that the program is ready for execution when power is applied to the system. With RAM a program 
must be loaded into memory each time power is applied to the processor. Notice, however, that storing programs 
in RAM allows a multi-purpose system since different programs can be loaded to serve different needs. 

Two special types of ROM - PROM (Programmable Read Only Memory) and EPROM (Eraseable Programmable 
Read Only Memory) are frequently used during program development. These memories are useful during 
program development since they can be altered by a special PROM programmer. In high-volume commercial 
applications, these special memories are usually replaced by less expensive ROM's. 



RAM 



Even if your program resides entirely in ROM, your application is likely to require some random access memory. 
Any time your program attempts to write any data to memory, that memory must be RAM. Also, if your pro- 
gram uses the stack, you need RAM. If your program modifies any of its own instructions (this procedure is 
discouraged), those instructions must reside in RAM. 

The mix of ROM and RAM in an application is important to both the system designer and the programmer. 
Normally, the programmer must know the physical addresses of the RAM in the system so that data variables 



1-5 



Chapter 1. Assembly Language and Processors 



can be assigned within those addresses. However, the relocation feature of this assembler allows you to code a 
program without concern for the ultimate placement of data and instructions; these program elements can be 
repositioned after the program has been tested and after the system's memory layout is final. The relocation 
feature is fully explained in Chapter 4 of this manual. 



Program Counter 

With the program counter, we reach the first of the 8080's internal registers illustrated in Figure 1-3. 

NOTE 

Except for the differences listed at the end of this chapter, 
the information in this chapter applies equally to the 8080 
and the 8085. 

The program counter keeps track of the next instruction byte to be fetched from memory (which may be either 
ROM or RAM). Each time it fetches an instruction byte from memory, the processor increments the program 
counter by one. Therefore, the program counter always indicates the next byte to be fetched. This process 
continues as long as program instructions are executed sequentially. To alter the flow of program execution as 
with a jump instruction or a call to a subroutme, the processor overwrites the current contents of the program 
counter with the address of the new instruction. The next instruction fetch occurs from the new address. 



















8080 1 




ACCUMULATOR 


FLAGS 


8085 














HIbH LOW 






INSTRUCTION 
DECODER 




B 


C 




STACK 1 POINTER 


















D 


E 




PROGRAM j COUNTER 






















DATA BUS LATCH 




H 


L 




ADDRESS j BUS LATCH 






















n 



















\7 



8-bit 

bidirectional 

data bus 












16-bit 
address bus 




ROM 

INSTRUCTIONS 

CONSTANT 
DATA 




RAM 
INSTRUCTIONS 

VARIABLE 
DATA 
STACK 




INPUT 
PORTS 




OUTPUT 
PORTS 













Figure 1-3. 8080/8085 Internal Registers 



1-6 



Chapter 1. Assembly Language and Processors 

Work Registers 

The 8080 provides an 8-bit accumulator and six other general purpose work registers, as shown in Figure 1-3. 

Programs reference these registers by the letters A (for the accumulator), B, C, D, E, H, and L. Thus, the 
instruction ADD B may be interpreted as 'add the contents of the B register to the contents of the accumu- 
lator. 

Some instructions reference a pair of registers as shown in the following: 

Symbolic Reference Registers Referenced 

B B and C 

D D and E 

H H and L 

M H and L (as a memory reference) 

PSW A and condition flags (explained 

later in this section) 



The symbolic reference for a single register is often the same as for a register pair. The instruction to be executed 
determines how the processor interprets the reference. For example, ADD B is an 8-bit operation. By contrast 
PUSH B (which pushes the contents of the B and C registers onto the stack) is a 16-bit operation. 

Notice that the letters H and M both refer to the H and L register pair. The choice of which to use depends on 
the instruction. Use H when an instruction acrs upon the H and L register pair as in INX H (increment the 
contents of H and L by one). Use M when an instruction addresses memory via the H and L registers as in ADD 
M (add the contents of the memory location specified by the H and L registers to the contents of the accumu- 
lator). 

The general purpose registers B, C, D, E, H, and L can provide a wide variety of functions such as storing 8-bit 
data values, storing intermediate results in arithmetic operations, and storing 16-bit address pointers. Because of 
the 8080's extensive instruction set, it is usually possible to achieve a common result with any of several 
different instructions. A simple add to the accumulator, for example, can be accomplished by more than half a 
dozen different instructions. When possible, it is generally desirable to select a register-to-register instruction 
such as ADD B. These instructions typically require only one byte of program storage. Also, using data already 
present in a register eliminates a memory access and thus reduces the time required for the operation. 

The accumulator also acts as a general-purpose register, but it has some special capabilities not shared with the 
other registers. For example, the input/output instructions IN and OUT transfer data only between the accumu- 
lator and external I/O devices. Also, many operations involving the accumulator affect the condition flags as ex- 
plained in the next section. 

Example; 

The following figures illustrate the execution of a move instruction. The MOV M,C moves a copy of the contents 
of register C to the memory location specified by the H and L registers. Notice that this location must be in 
RAM since data is to be written to memory. 



1-7 



Chapter 1. Assembly Language and Processors 



INSTRUCTION 
DECODER 



DATA BUS LATCH 



ACCUMULATOR 


FLAGS 




B 


C 




D 


E 




H 


L 



HIGH 



LOW 



8080 
8085 



STACK 



POINTER 



PROGRAM 



COUNTER 



ADDRESS 



BUS LATCH 



ROM 



RAM 



Figure 1-4. Instruction Fetch 



The processor initiates tiie instruction fetch by latching the contents of the program counter on the address bus, 
and then increments the program counter by one to indicate the address of the next instruction byte. When the 
memory responds, the instruction is decoded into the series of actions shown in Figure 1-5. 



NOTE 

The following description of the execution of the 
MOV M,C instruction is conceptually correct, but 
does not account for normal bus control. For details 
concerning memory interface, refer to the User's 
Manual for your processor. 



1-8 



Chapter 1. Assembly Language and Processors 





















8080 
8085 




ACCUMULATOR 


FLAGS 




LOW 
















B 


C 


HIGH 




INSTRUCTION 
DECODER 
























STACK 


POINTER 




























D 


E 




PROGRAM 


COUNTER 


























DATA BUS LATCH 






H 


L 




ADDRESS 


BUS LATCH 




























^ 


r 














^ .' 








ROM 




RAM 







Figure 1-5. Execution of MOV M,C Instruction 



To execute the MOV M,C instruction, the processor latches the contents of the C register on the data bus and 
the contents of the H and L registers on the address bus. When the memory accepts the data, the processor 
terminates execution of this instruction and initiates the next instruction fetch. 



Internal Work Registers 

Certain operations are destructive. For example, a compare is actually a subtract operation; a zero result indicates 
that the opreands are equal. Since it is unacceptable to destroy either of the operands, the processor includes 
several work registers reserved for its own use. The programmer cannot access these registers. These registers are 
used for internal data transfers and for preserving operands in destructive operations. 



Condition Flags 

The 8080 provides five flip flops used as condition flags. Certain arithmetic and logical instructions alter one or 
more of these flags to indicate the result of an operation. Your program can test the setting of four of these 
flags (carry, sign, zero, and parity) using one of the conditional jump, call, or return instructions. This allows you 
to alter the flow of program execution based on the outcome of a previous operation. The fifth flag, auxiliary 
carry, is reserved for the use of the DAA instruction, as will be explained later in this section. 

It is important for the programmer to know which flags are set by a particular instruction. Assume, for example, 
that your program is to test the parity of an input byte and then execute one instruction sequence il parity is 
even, a different instruction set if parity is odd. Coding a JPE (jump if parity is even) or JPG (jump il parity is 



1-9 



Chapter 1. Assembly Language and Processors 



odd) instruction immediately following the IN (input) instruction produces false results since the IN instruction 
does not affect the condition flags. The jump executed by your program reflects the outcome of some previous 
operation unrelated to the IN instruction. For the operation to work correctly, you must include some instruc- 
tion that alters the parity flag after the IN instruction, but before the jump instruction. For example, you can 
add zero to the accumulator. This sets the parity flag without altering the data in the accumulator. 

In other cases, you will want to set a flag with one instruction, but then have a number of intervening instruc- 
tions before you use it. In these cases, you must be certain that the intervening instructions do not affect the 
desired flag. 

The flags set by each instruction are detailed in the individual instruction descriptions in Chapter 3 of this 
manual. 

NOTE 



When a flag is 'set' it is set ON (has the value one); 
when a flag is 'reset' it is reset OFF (has the value 
zero). 



Carry Flag 

As its name implies, the carry flag is commonly used to indicate whether an addition causes a 'carry' into the 
next higher order digit. The carry flag is also used as a 'borrow' flag in subtractions, as explained under 'Two's 
Complement Representation of Data' in Chapter 2 of this manual. The carry flag is also affected by the logical 
AND, OR, and exclusive OR instructions. These instructions set ON or OFF particular bits of the accumulator. 
See the descriptions of the ANA, ANI, ORA, ORI, XRA, and XRI instructions in Chapter 3. 

The rotate instructions, which move the contents of the accumulator one position to the left or right, treat the 
carry bit as though it were a ninth bit of the accumulator. See the descriptions of the RAL, RAR, RLC, and RRC 
instructions in Chapter 3 of this manual. 

Example: 

Addition of two one-byte numbers can produce a carry out of the high-order bit; 

Bit Number: 7654 3210 

AE= 1010 1110 

-t-74= 0111 0100 



0010 0010 = 22 carry flag = 1 

An addition that causes a carry out of the high order bit sets the carry flag to 1; an addition that does not cause 
a carry resets the flag to zero. 



Sign Flag 

As explained under 'Two's Complement Representation of Data' in Chapler 2, bit 7 of a result in the accumulator 
can be interpreted as a sign. Instructions that affect the sign flag set the flag equal to bit 7. A zero in bit 7 



1-10 



chapter 1. Assembly Language and Processors 



indicales a positive value; a one indicates a negative value. This value is duplicated in the sign flag so that 
conditional jump, call, and return instructions can test for positive and negative values. 



Zero Flag 

Certain instructions set the zero flag to one to indicate that the result in the accumulator contains all zeros. 
These instructions reset the flag to zero if the result in the accumulator is other than zero. A result that has a 
carry and a zero result also sets the zero bit as shown below; 

1010 0111 
+0101 1001 



0000 0000 Carry Flag = 1 
Zero Flag = 1 



Parity Flag 

Parity is determined by counting the number of one bits set in the result in the accumulator. Instructions that 
affect the parity flag set tlie flag to one for even parity and reset the flag to zero to indicate odd parity. 



Auxiliary Carry Flag 

The auxiliary carry flag indicates a carry out of bit 3 of the accumulator. You cannot test this flag directly in 
your program; it is present to enable the DAA (Decimal Adjust Accumulator) to perform its function. 

The auxiliary carry flag and the DAA instruction allow you to treat the value in the accumulator as two 4-bit 
binary coded decimal numbers. Thus, the value 0001 1001 is equivalent to 19. (If this value is interpreted as a 
binary number, it has the value 25.) Notice, however, that adding one to this value produces a non-decimai 
result: 

0001 1001 
+0000 0001 



0001 1010 = lA 

The DAA instruction converts hexadecimal values such as the A in the preceding example back into binary coded 
decimal (BCD) format. The DAA instruction requires the auxiliary carry flag since the BCD format makes it 
possible for arithmetic operations to generate a carry from the low-order 4-bit digit into the high-ordet 4-bit 
digit. The DAA performs the following addition to correct the preceding example; 

0001 1010 
+0000 0110 



0001 0000 
+0001 0000 (auxiliary carry) 

0010 0000 = 20 

Ml 



Chapter 1. Assembly Language and Processors 



The auxiliary carry flag is affected by all add, subtract, increment, decrement, compare, and all logical AND, 
OR, and exclusive OR instructions. (See the descriptions of these instructions in Chapter 3.) There is some 
difference in the handling of the auxiliary carry flag by the logical AND instructions in the 8080 processor and 
the 8085 processor. The 8085 logical AND instructions always set the auxiliary flag ON. The 8080 logical AND 
instructions set the flag to reflect the logical OR of bit 3 of the values involved in the AND operation. 



Stack and Stack Pointer 

To understand the purpose and effectiveness of the stack, it is useful to understand the concept of a subroutine. 

Assume that your program requires a multiplication routine. (Since the 8080 has no multiply instructions, this 
can be performed through repetitive addition. For example, 3x4 is equivalent to 3+3+3+3.) Assume further that 
your program needs this multiply routine several times. You can recede this routine inline each time it is needed, 
but this can use a great deal of memory. Or, you can code a subroutine: 



Inline Coding 



Subroutine 



inline routine 



CALL 



inline routme 



inline routme 




subroutine 



CALL 




The 8080 provides instructions that call and return from a subroutine. When the call instruction is executed, the 
address of the next instruction (the contents of the program counter) is pushed onto the stack. The contents of 
the program counter are replaced by the address of the desired subroutine. At the end of the subroutine, a 
return instruction pops that previously-stored address off the stack and puts it back into the program counter. 
Program execution then continues as though the subroutine had been coded inline. 

The mechanism that makes this possible is, of course, the stack. The slack is simply an area of random access 
memory addressed by the stack pointer. The slack pointer is a hardware register maintained by the processor. 
However, your program must initialize the stack pointer. This means that your program must load the base 
address of the stack into the stack pointer. The base address of the stack is commonly assigned to the highest 
available address in RAM. This is because the stack -expands by decrementing the stack pointer. As items are 



1-12 



Chapter 1 . Assembly Language and Processors 



added to the stack, it expands into memory locations with lower addresses. As items are removed from the 
stack, the stack pointer is incremented back toward its base address. Nonetheless, the most recent item on the 
stack is known as the 'top of the stack.' Stack is still a most descriptive term because you can always put 
something else on top of the stack. In terms of programming, a subroutine can call a subroutine, and so on. 
The only limitation to the number of items that can be added to the stack is the amount of RAM available for 
the stack. 

The amount of RAM allocated to the stack is important to the programmer. As you write your program, you 
must be certain that the stack will not expand into areas reserved for other data. For most applications, this 
means that you must assign data that requires RAM to the lowest RAM addresses available. To be more precise, 
you must count up all instructions that add data to the stack. Ultimately, your program should remove from 
the stack any data it places on the stack. Therefore, for any instruction that adds to the stack, you can sub- 
tract any Intervening instruction that removes an item from the stack. The most critical factor is the maximum 
size of the stack. Notice that you must be sure to remove data your program adds to the stack. Otherwise, any 
left-over items on the stack may cause the stack to grow into portions of RAM you intend for other data. 



Stack Operations 

Stack operations transfer sixteen bits of data between memory and a pair of processor registers. The two basic 
operations are PUSH, which adds data to the stack, and POP, which removes data from the slack. 

A call instruction pushes the contents of the program counter (which contains the address of the next instruction) 
onto the slack and then transfers control to the desired subroutine by placing its address in the program counter. 
A return instruction pops sixteen bits off the stack and places them in the program counter. This requires the 
programmer to keep track of what is in the stack. For example, if you call a subroutine and the subroutine 
pushes data onto the stack, the subroutine must remove that data before executing a return instruction. Other- 
wise, the return instruction pops data from the stack and places it in the program counter. The results are 
unpredictable, of course, but probably not what you want. 



Saving Program Status 

It is likely that a subroutine requires the use of one or more of the working registers. However, it is equally 
likely that the main program has data stored in the registers that it needs when control returns to the main 
program. As general rule, a subroutine should save the contents of a register before using it and then restore 
the contents of that register before returning control to the main program. The subroutine can do this by 
pushing the contents of the registers onto the stack and then popping the data back into the registers before 
executing a return. The following instruction sequence saves and restores all the working registers. Notice that 
the POP instructions must be in the opposite order of the PUSH instructions if the data is to be restored to its 
original location. 



1-13 



Chapter 7. Assembly Language and Processors 



SUBRTN: PUSH PSW 

PUSH B 

PUSH D 

PUSH H 

subroutine coding 

POP H 
POP D 
POP B 
POP PSW 

RETURN 

The letters B, D, and H refer to the B and C, D and E, and H and L register pairs, respectively. PSW refers to 
the program status word. The program status word is a 16-bit word comprising the contents of the accumulator 
and the five condition flags. (PUSH PSW adds three bits of filler to expand the condition flags into a full 
byte; POP PSW strips out these filler bits.) 



Input/Output Ports 

The 256 input/output ports provide communication with the outside world of peripheral devices. The IN and 
OUT instructions initiate data transfers. 

The IN instruction latches the number of the desired port onto the address bus. As soon as a byte of data is 
returned to the data bus latch, it is transferred into the accumulator. 

The OUT instruction latches the number of the desired port onto the address bus and latches the data in the 
accumulator onto the data bus. 

The specified port number is duplicated on the address bus. Thus, the instruction IN 5 latches the bit configura- 
tion 0000 0101 0000 0101 onto the address bus. 

Notice that the IN and OUT instructions simply initiate a data transfer. It is the responsibility of the peripheral 
device to detect that it has been addressed. Notice also that it is possible to dedicate any number of ports to 
the same peripheral device. You might use a number of ports as control signals, for example. 

Because input and output are almost totally application dependent, a discussion of design techniques is beyond 
the scope of this manual. 

For additional hardware information, refer to the 8080 or 8085 Microcomputer Systems User's Manual. 

For related programming information, see the descriptions of the IN, OUT, Dl, El, RST, and RIM and SIM 
instructions in Chapter 3 of this manual. (The RIM and SIM instructions apply only to the 8085.) 



1-14 



Chapter 1. Assembly Language and Processors 



Instruction Set 



The 8080 incorporates a powerful array of instructions. This section provides a general overview of the instruc- 
tion set. The detailed operation of each instruction is described in Chapter 3 of this manual. 



Addressing Modes 

Instructions can be categorized according to their method of addressing the hardware registers and/or memory. 

Implied Addressing. The addressing mode of certain instructions is implied by the instruction's function. For 
example, the STC (set carry flag) instruction deals only with the carry flag; the DAA (decimal adjust accumu- 
lator) instruction deals with the accumulator. 

Register Addressing. Quite a large set of instructions call for register addressing. With these instructions, you 
must specify one of the registers A through E:, H or L as well as the operation code. With these instructions, 
the accumulator is implied as a second operand. For example, the instruction CMP E may be interpreted as 
mpare the contents of the E register with the contents of the accumulator.' 



CO 



Most of the instructions that use register addressing deal with 8-bit values. However, a few of these instructions 
deal with 16-bit register pairs. For example, the PCHL instruction exchanges the contents of the program counter 
with the contents of the H and L registers. 



Immediate Addressing. Instructions that use immediate addressing have data assembled as a part of the instruction 
itself. For example, the instruction CPl 'C may be interpreted as 'compare the contents of the accumulator with 
the letter C When assembled, this instruction has the hexadecimal value FE43. Hexadecimal 43 is the internal 
representation for the letter C. When this instruction is executed, the processor fetches the first instruction byte 
and determines that it must fetch one more ayte. The processor fetches the next byte into one of its internal 
registers and then performs the compare ope'ation. 

Notice that the names of the immediate instructions indicate that they use immediate data. Thus, the name of an 
add instruction is ADD; the name of an add immediate instruction is ADI. 

All but two of the immediate instructions use the accumulator as an implied operand, as in the CPl instruction 
shown previously. The MVI (move immediate) instruction can move its immediate data to any of the working 
registers, including the accumulator, or to memory. Thus, the instruction MVI D,OFFH moves the hexadecimal 
value FF to the D register. 

The LXI instruction (load register pair immediate) is even more unusual in that its immediate data is a 16-bit 
value. This instruction is commonly used to load addresses into a register pair. As mentioned previously, your 
program must initialize the stack pointer; LXI is the instruction most commonly used for this purpose. For ex- 
ample, the instruction LXI SP,30FFH loads the stack pointer with the hexadecimal value 30FF. 



Direct Addressing. Jump instructions include a 16-bit address as part of the instruction. For example, the 
instruction J MP lOOOH causes a jump to the hexadecimal address 1000 by replacing the current contents of the 
program counter with the new value 1000. 



1-15 



Chapter t. Assembly Language and Processors 



Instructions that include a direct address require three bytes of storage: one for the instruction code, and two 
for the 16-bit address. 



Register Indirect Addressing. Register indirect instructions reference memory via a register pair. Thus, the 
instruction MOV M,C moves the contents of the C register into the memory address stored in the H and L 
register pair. The instruction LDAX B loadi the accumulator with the byte of data specified by the address 
in the B and C register pair. 



Combined Addressing IVIodes. Some instructions use a combination of addressing modes. A CALL instruction, 
for example, combines direct addressing and register indirect addressing. The direct address in a CALL instruction 
specifies the address of the desired subroutine; the register indirect address is the stack pointer. The CALL 
instruction pushes the current contents of the program counter into the memory location specified by the stack 
pointer. 

Timing Effects of Addressing Modes. Addressing modes affect both the amount of time required for executing 
an instruction and the amount of memory required for its storage. For example, instructions that use implied or 
register addressing execute very quickly since they deal directly with the processor hardware or with data already 
present in hardware registers. More important, however, is that the entire instruction can be fetched with a 
single memory access. The number of memory accesses required is the single greatest factor in determining 
execution timing. More memory accesses require more execution time. A CALL instruction, for example, requires 
five memory accesses: three to access the entire instruction, and two more to push the contents of the program 
counter onto the stack. 

The processor can access memory once during each processor cycle. Each cycle comprises a variable number of 
states. (The individual instruction descriptions in Chapter 3 specify the number of cycles and states required for 
each instruction.) The length of a state depends on the clock frequency specified for your system, and may 
range from 480 nanoseconds to 2 microseconds. Thus, the timing of a four state instruction may range from 
1.920 microseconds through 8 microseconds. (The 8085 has a maximum clock frequency of 320 nanoseconds 
and therefore can execute instructions abojt 50% faster than the 8080.) 



Instruction Naming Conventions 

The mnemonics assigned to the instructions are designed to indicate the function of the instruction. The instruc- 
tions fall into the following functional categories; 

Data Transfer Group. The data transfer instructions move data between registers or between memory and 
registers. 

MOV Move 

MVI Move Immediate 

LDA Load Accumulator Directly from Memory 

STA Store Accumulator Directly in Memory 

LHLD Load H and L Registers Directly from Memory 

SHLD Store H and L Registers Directly in Memory 

ALL MNEMONICS© 1974, 1975, 1976, 1977 INTEL CORPORATION 
1-16 



Chapter 1. Assembly Language and Processors 



An 'X' in the name of a data transfer instruction implies that it deals with a register pair: 

LXI Load Register Pair with Immediate data 

LDAX Load Accumulator from Address in Register Pair 

STAX Store Accumulator in Address in Register Pair 

XCHG Exchange H and L with D and E 

XTHL Exchange Top of Stack with H and L 



Arithmetic Group. The arithmetic instructions add, subtract, increment, or decrement data in registers or 
memory. 

ADD Add to Accumulator 

ADI Add immediate Data to Accumulator 

ADC Add to Accumulator Using Carry Flag 

AC! Add Immediate Data to Accumulator Using Carry Flag 

SUB Subtract from Accumulator 

SUI Subtract Immediate Data from Accumulator 

SBB Subtract from Accumulator Using Borrow (Carry) Flag 

SBI Subtract Immediate from Accumulator Using Borrow 

INR Increment Specified Byte by One 

DCR Decrement Specified Byte by One 

INX Increment Register Pair by One 

DCX Decrement Register Pair by One 

DAD Double Register Add: Add Contents of Register 

Pair to H and L Register Pair 



Logical Group. This group performs logical (Boolean) operations on data in registers and memory and on 
condition flags. 

The logical AND, OR, and Exclusive OR instructions enable you to set specific bits in the accumulator ON or 
OFF. 

ANA Logical AND with Accumulator 

ANI Logical AND with Accumulator Using Immediate Data 

ORA Logical OR with Accumulator 

ORI Logical OR with Accumulator Using Immediate Data 

XRA Exclusive Logical OR with Accumulator 

XRl Exclusive OR Using Immediate Data 

The compare instructions compare the contents of an 8-bit value with the contents of the accumulator: 

CMP Compare 

CPI Compare Using Immediate Data 



ALL MNEMONICS ©1974, 1975, 1976, 1977 INTEL CORPORATION 

1-17 



Chipier 1. Assembly Language and Processors 

The rotate instructions sliift the contenls of the accumulator one bit position to the left or right; 

RLC Rotate Accumulator Left 

RRC Rotate Accumulator Right 

RAL Rotate Left Through Carry 

RAR Rotate R ght Through Carry 

Complement and carry flag instructions: 

CMA Complement Accumulator 

CMC Complement Carry Flag 

STC Set Carry Flag 



Branch Group. The branching instructions alter normal sequential program flow, either unconditionally or 
conditionally. The unconditional branching instructions are as follows; 

jMP Jump 

CALL Call 

RET Return 

Conditional branching instructions examine the status of one of four condition flags to determine whether the 
specified branch is to be executed. The conditions that may be specified are as follows; 

NZ Not Zero (Z = 0) 

Z Zero (Z == 1) 

NC No Carry (C = 0) 

C Carry (C = 1 ) 

PO Parity Odd (P = 0) 

PE Parity Even (P = 1) 

P Plus (S = 0) 

M Minus (S = 1) 

Tiius, the conditional branching instructions are specified as follows; 

Jumps Calls Returns 

JC CC RC (Carry) 

JNC CNC RNC (No Carry) 

JZ CZ RZ (Zero) 

JNZ CNZ RNZ (Not Zero) 

)P CP RP (Plus) 

|M CM RM (Minus) 

)PE CPE RPE (Parity Even) 

|P0 CPO RPO (Parity Odd) 

Two other instructions can effect a branch by replacing the contents of the program counter; 

PCHL Move H and L to Program Counter 

RST Special Fiestart Instruction Used with Interrupts 

ALL MNEMONICS© 1974, 1975, 1976, 1977 INTEL CORPORATION 
1-18 



Chapter 1. Assembly Language and Processors 



Stack, I/O, and Machine Control Instructions. The following instructions affect the stack and/or stack pointer: 

PUSH Push Two Bytes of Data onto the Stack 

POP Pop Two Bytes of Data off the Stack 

XTHL Exchange Top of Stack with H and L 

SPHL Move contents of H and L to Stack Pointer 

The I/O instructions are as follows: 

IN Initiate Input Operation 

OUT Initiate Output Operation 

The machine control instructions are as follows: 

E\ Enable Interrupt System 

Dl Disable Interrupt System 

HLT Halt 

NOP No Operation 



HARDWARE/INSTRUCTION SUMMARY 

The following illustrations graphically summarize the instruction set by showing the hardware acted upon by 
specific instructions. The type of operand allowed for each instruction is indicated through the use of a code. 
When no code is given, the instruction does not allow operands. 

Code Meaning 

REGMo The operand may specify one of the 8-bit registers A,B,C,D,E,H, or L or M 

(a memo-y reference via the 16-bit address in the H and L registers). The 
MOV instruction, which calls for two operands, can specify M for only one 
of its operands. 

Do Designates 8-bit immediate operand. 

A,r Designates a 16-bit address. 

Po Designates an 8-bit port number. 

REG|g Designates a 16-bit register pair (B<&C,D<&E,H<&L, or SP). 

D,r Designates a 16-bit immediate operand. 



Accumulator Instructions 

The following illustration shows the instructions that can affect the accumulator. The instructions listed above 
the accumulator all act on the data in the accumulator, and all except CMA (complement accumulator) affect 
one or more of the condition flags. The instructions listed below the accumulator move data into or out of the 
accLmiulaior, but do not affect condition flags. The STC (set carry) and CMC (complement carry) instructions 
arc also shown here. 



ALL MNEMONICS ©1974, 1975, 1976, 1977 INTEL CORPORATION 

1-19 



Chapter 1. Assembly Language and Processors 





ADD\ 






AD1\ 






ADC 




ACl 




SUB 




SUI 




SBB 

ANA 


> REGMg 


SBl 

ANl 


^8 


XRA 




XRI 




ORA 




OR! 




CMP^ 




CPI / 




RL 


C RAL 


RRC 


RA 


R CMA 


DAA 






INR "l 
DCRj 


REGM„ 

O 






ACCUMULATOR 


FLAGS 


STC CMC 
















B 


C 














EGMj^ 


D 


E 
















H 


L 





HIGH 



LOW 



STACK I POINTER 



PROGRAM I COUNTER 



LDAX 
STAX 



LDA 
STA 



MVI 



BC.DE 



16 



MEMORY 



STACK 



IN Pc 



OUT Pg 



INPUT 
PORTS 



OUTPUT 
PORTS 



MOV REGM^.REG^ 



ALL MNEMONICS© 1974, 1975, 1976, 1977 INTEL CCRrORATION 



1-20 



Chapter 1. Assembly Language and Processors 



Register Pair (Word) Instructions 

The following instructions all deal with 16-bit words. Except for DAD (which adds thecontents of the B&C or 
D&E register pair to H&L), none of these instructions affect the condition flags. DAD affects only the carry 
flag. 



ACCUMULATOR 


FLAGS 



/ 



B 


C 



D 


E 



\ 



INX 

DCX > REG rSPHL 

dad] 



HIGH 



LOW 



XCHG 



STACK 1 POINTER 

1 



PCHL-^ 



PROGRAM I COUNTER 

I 



XTHL 



LHLD 
SHLD 



LXI REG^^.D,^ 
Id Id 



MEMORY 



STACK 



PUSH 
POP 



B,D,H,PSW 



ALL MNEMONICS © 1974, 1975, 1976, 1977 INTEL CORPORATION 



1-21 



Chapter 1. Assembly Language and Processors 



Branching Instructions 



The following instructions can alter the con:ent5 of the program counter, thereby altering the normal sequential 
execution flow. Jump instructions affect only the program counter. Call and Return instructions affect the 
program counter, stack pointer, and stack. 



ACCUMULATOR 


FLAGS 



HIGH 



B 


C 



STACK 



D 


E 



PCHL 



PROGRAM 



LOW 



POINTER 



COUNTER 



RST 



CALL 



RET 



c 


JNC 


z 


JNZ 


p 


JM 


PE 


JPO 



> A 



16 





\ 


cc 


CNC 


cz 


CNZ 


CP 


CM f 


CPE CPO 



> A 



16 



RC 


RNC 


RZ 


RNZ 


RP 


RM 


RPE 


RPO 



>Ai6 



MEMORY 



STACK 



CONTROL INSTRUCTIONS 

RST 

NOP 

HLT 

El 

Dl 

SIM 

RIM 



8085 only 



ALL MNEMONICS© 1974, 1975, 1976, 1977 INTEL CORPORATION 



1-22 



Instruction Set Guide 



Chapter 1. Assembly Language and Processors 



The following is a summary of the instruction set: 



ADD 






ADI 


ADC 






ACI 


SUB 






SU! 


SBB 

ANA 


> REGMg 




SB! 
AN! 


XRA 






XRI 


ORA 






ORl 


CMP 






CPI 


RLC RAL 
RAR CMA 
INRl 
DCRf 


RRC 

DAA 

REGMg 





ACCUMULATOR 



FLAGS 



MOV REGMg, REGMg 

I 
LXl REGi6,Dig 



ISTC CMC 

dcxIreg.^ sphu 

:^DADf ^^ 

}^ > PCHL 

XCHG 



HIGH 



LOW 



STACK 



POINTER 



ti 



PROGRAM 



COUNTER 



-RST 



-XTHL — 1 



JC 
JZ 
IP 



JMP 

JNC 
JNZ 
IM 



RET 



>Ai6 



JPE JPOj 



LHLD 



LDAXl 



STHD f '^le 



A, 



STAXj 



LDA 
STA 



BC,DE 



16 



MVi Dg 

MOV REGMg.REGMg 

CODE 



MEMORY 



STACK 




OUT P, 



OUTPUT 
PORTS 



PUSH 

POP > B,D,H,PSW 



CALL 

CC CNC"^ 
CZ CNZ . 
CP CM > ^16 



CPE CPO 



CONTROL 
INSTRUCTIONS 

RST 

NOP 

HLT 

El 

Dl 

SIM 

RIM 



RC 


RNC"] 


RZ 


RNZ 


RP 


RM [ 


RPE 


RPoJ 



16 



8085 ONLY 



MEANING 



REGMc 



D8 

^16 

^8 
REG 

Dl6 



16 



The operand may specify one of the 8-bit registers A,B,C,D,E,H, or L or M (a memory 

reference via the 16-bit address in the H and L registers). The MOV instruction, which 

calls for two operands, can specify M for only one of its operands. 

Designates 8-bit immediate operand. 

Designates a 16-bit address. 

Designates an 8-bit port number. 

Designates a 16-bit register pair (B&C,D&E,H&L,or SP). 

Designates a 16 -bit immediate operand. 



ALL MNEMONICS© 1974, 1975, 1976, 1977 INTEL CORPORATION 



1-23 



Chapter 1. Assembly Language and Processors 



8085 PROCESSOR DIFFERENCES 

The differences between Ihc 8080 processor and the 8085 processor will Idc more obvious to the system designer 
than to the programmer. Except for two additional instructions, the 8085 instruction set is identical to and fully 
compatible with the 8080 instruction set. Most programs written for the 8080 should operate on the 8085 with- 
out modification. The only programs that ma/ require changes arc those with critical timing routines; the higher 
system speed of the 8085 may alter the time values of such routines. 

A partial listing of 8085 design features includes the following: 



• A single 5 volt power supply. 






Execution speeds approximately 50% faster than the 8080. 

Incorporation in the processor of the features of the 8224 Clock Generator and Driver and the 

8228 System Controller and Bus Driver. 

A non-maskable TRAP interrupt for handling serious problems such as power failures. 

Three separately maskable interrupts that generate internal RST instructions. 

Input/output lines for serial data transfer. 



Programming for the 8085 

For the programmer, the new features of the 8085 are summarized in the two new instructions SIM and RIM. 
These instructions differ from 'the 8080 instrjctions in that each has multiple functions. The SiM instruction 
sets the interrupt mask and/or writes out a bit of serial data. The programmer must place the desired interrupt 
mask and/or serial output in the accumulate! prior to execution of the SIM instruction. The RIM instruction 
reads a bit of serial data if one is present and the interrupt mask into the accumulator. Details of these instruc- 
tions arc covered in Chapter 3. 

Despite the new interrupt features of the 8085, programming for interrupts is little changed. Notice, however, that 
8085 hardware interrupt RESTART addresses fall between the existing 8080 RESTART addresses. Therefore, 
only four bytes are available for certain RST instructions. Also, the TRAP inlerrupt input is non-maskable and 
cannot be disabled, if your application uses :his input, be certain to provide an interrupt loutinc for it. 

The interrupts have the following priority; 

TRAP highest 

RST7.5 

RST6.5 

RST5.5 

INTR lowest 

When more than one interrupt is pending, the processor always recognizes the higher priority interrupt first. 
These priorities apply only to the sequence in which interrupts are recognized. Program routines that service 
interrupts have no special priority. Thus, an RST5.5 interrupt can interrupt the service routine for an RST7.5 
interrupt. If you want to protect a service routine from interruption, either disable the interrupt system (Di 
instruction), or mask out other potential interrupts (SIM instruction). 



1-24 



Chapter 1. Assembly Language and Processors 



Conditional Instructions 

Execution of conditional instructions on the 8085 differs from the 8080. The 8080 fetches ail three instruction 
bytes whether or not the condition is satisfied. The 8085 evaluates the condition while it fetches the second 
instruction byte. If the specified condition is not satisfied, the 8085 skips over the third instruction byte and 
immediately fetches the next instruction. Skipping the unnecessary byte allows for faster execution. 



1-25 



2. ASSEMBLY LANGUAGE CONCEPTS 



INTRODUCTION 



Jusl as ihe English language has its rules of grammar, assembly language has certain coding rules. The source line 
is the assembly language equivalent of a sentence. 

This assembler recognizes three types of source lines; instructions, directives, and controls. This manual describes 
instructions and directives. Controls are described in the operator's manual for your version of the assembler. 

This chapter describes the general rules for coding source lines. Specific instructions (see Chapter 3) and 
directives (sec Chapters 4 and 5) may have specific coding rules. Even so, the coding of such instructions and 
directives must conform to the general rules in this chapter. 



SOURCE LINE FORMAT 

Assembly language instructions and assembler directives may consist of up to four fields, as follows: 

Label:\ Opcode Operand ;Comment 

Name 

The fields may be separated by any number of blanks, but must be separated by at least one delimiter. Each 
instruction and directive must be entered on a si;igle line terminated by a carriage return and a line feed. No 
continuation lines are possible, but you may have lines consisting entirely of comments. 

Character Set 

The following characters are legal in assembly language source statements: 

• The letters of the alphabet, A through Z. Both upper- and lower-case letters are allowed. Internally, 
the assembler treats all letters as though they were upper-case, but the characters are printed exactly 
as they were input in the assembly listing. 

• The digits through 9. 

• The following special characters: 



2-1 



Chapter 2. Assembly Language Concepts 



Character Meaning 

+ Plus sign 

Minus sign 

* Asterisl< 

/ Slash 

Comma 

( Left parenthesis 

) Right parenthesis 

' Single quote 

& Ampersand 

Colon 

$ Dollar sign 

@ Commercial 'at' sign 

? Question marl< 

= Equal sign 

<^ Less than sign 

y Greater than sign 

% Percent sign 

! Exclamation point 

blanl< Blank or space 

; Semicolon 

Period 

CR Carriage return 

FF Form feed 

HT Horizontal tab 

In addition, any ASCII character may appear in a string enclosed in single quotes or in a comment. 



Delimiters 

Certain characters have special meaning to the assembler in that they function as delimiters. Delimiters define 
the end of a source statement, a field, or a component of a field. The following list defines the delimiters 
recognized by the assembler. Notice that many delimiters are related to the macro feature explained in Chapter 
5. Delimiters used for macros are shown herD so that you will not accidentally use a delimiter improperly. 
Refer to Chapter 5 for a description of macros. 



2-2 



Chapter 2. Assembly Language Concepts 



Character(s) 



blank 



Meaning 

one or more 
blanks 



Use 



field separator or symbol terminator 



comma 



separate operands in the operands field, 
including macro parameters 



pair of single delimit a character string 

quote characters 



pair of paren- 
theses 



delimit an expression 



CR 

HT 



carriage return statement terminator 

horizontal tab field separator or symbol terminator 

semicolon comment field delimiter 



<■••> 



colon 



delimiter for symbols used as labels 



ampersand delimit macro prototype text or formal 

parameters for concatenation 

pair of angle delimit macro parameter text which 

brackets contains commas or embedded blanks; 

also used to delimit a parameter list 



percent sign delimit a macro parameter that is to be 

evaluated prior to substi.tution 



exclamation 
point 



double semi 
colon 



an escape character used to pass the 
following character as part of a macro 
parameter when the character might 
otherwise be interpreted as a delimiter 

delimiter for comments in macro definitions 
when the comment is to be suppressed when 
the macro is expanded 



Label/Name Field 

Labels are always optional. An instruction label is a symbol name whose value is the location where the instruc- 
tion is assembled. A label may contain from one to six alphanumeric characters, but the first character must be 
alphabetic or the special characters '?' or '@'. The label name must be terminated with a colon. A symbol used 
as a label can be defined only once in your program. (See 'Symbols and Symbol Tables' later in this chapter.) 



2-3 



Chapter 2. Assembly Language Concepts 



Alphanumeric characters include the letters of the alphabet, the question mark character, and the decimal 
digits through 9. 

A name is required for the SET, EQU, and MACRO directives. Names follow the same coding rules as labels, 
except that they must be terminated with a blank rather than a colon. The label/name field must be empty for 
the LOCAL and ENDM directives. 



Opcode Field 

This required field contains the mnemonic operation code for the 8080/8085 instruction or assembler directive 
to be performed. 



Operand Field 

The operand field identifies the data to be operated on by the specified opcode. Some instructions require no 
operands. Others require one or two operands. As a general rule, when two operands are required (as in data 
transfer and arithmetic operations), the first operand identifies the destination (or target) of the operation's 
result, and the second operand specifics the source data. 



Examples: 



MOV A,C ;iV10VE CONTENTS OF REG C TO ACCUMULATOR 

MVI A,'B' ;MOVE B TO ACCUMULATOR 



Comment Field 



The optional comment field may contain anv information you deem useful for annotating your program. The 
only coding requirement for this field is that it be preceded by a semicolon. Because the semicolon is a delimiter, 
there is no need to separate the comment from the previous field with one or more spaces. However, spaces are 
commonly used to improve the readability of the comment. Although comments arc always optional, you should 
use them liberally since it is easier to debug and maintain a well documented program. 



CODING OPERAND FIELD INFORMATION 

There are four types of information (a through d in the following list) that may be requested as items in the 
operand field; the information may be specified in nine ways, each of which is described below. 



2-4 



Chapter 2. Assembly Language Concepts 



OPERAND FIELD INFORMATION 

Information required Ways of specifying 



(a) Register 

(b) Register Pair 

(c) Immediate Data 

(d) 16-bit Address 



(1) 


Hexadecimal Data 


(2) 


Decimal Data 


(3) 


Octal Data 


(4) 


Binary Data 


(5) 


Location Counter ($) 


(6) 


ASCII Constant 


(7) 


Labels assigned values 


(8) 


Labels of instructions or data 


(9) 


Expressions 



Hexadecimal Data. Each hexadecimal number must begin with a numeric digit (0 through 9) and must be 
followed by the letter H. 

Label Opcode Operand Comment 

HERE: MV! C.OBAH ;LOAD REG C WITH HEX BA 

Decimal Data. Each decimal number may be identified by the letter D immediately after its last digit or may 
stand alone. Any number not specifically identified as hexadecimal, octal, or binary is assumed to be decimal. 
Thus, the following statements are equivalent: 

Label Opcode Operand Comment 

ABC: MVI E,15 ;LOAD E WITH 1 5 DECIMAL 

MVI E,15D 

Octal Data. Each octal number must be followed by the letter O or the letter Q. 
Label Opcode Operand Comment 

LABEL: MVI A,72Q ;LOAD OCTAL 72 INTO ACCUM 

Binary Data. Each binary number must be followed by the letter B. 

Label Opcode Operand Comment 

NOW: MVI 0,111 101 10B ;LOAD REGISTER D 

;WITH 0F6H 



2-5 



Chapter 2. Assembly Language Concepts 



Location Counter. The $ character refers to the current location counter. The location counter contains the 
address where the current instruction or data statement will be assembled. 



Label Opcode Operand Comment 

GO: JMP $+6 ;JUMP TO ADDRESS 6 BYTES BEYOND 

THE FIRST BYTE OF THIS 
INSTRUCTION 



ASCII Constant. One or more ASCII characters enclosed in single quotes define an ASCII constant. Two 
successive single quotes must be used to represent one single quote within an ASCII constant. 



Label 



DATE: 



Opcode 
MVI 

DB 



Operand 



Comment 



;LOAD E REG WITH 8-BIT ASCII 
;REPRESENTATION OF * 
TODAY'S DATE' 



Labels Assigned Values. The SET and EQU directives can assign values to labels. In the iollowing example, 
assume that VALUE has been assigned the value 9FH; the two statements are equivalent: 



Label 



Opcode 



Operand 



Comment 



Al: 
A2: 



MVI 
MVI 



D,9FH 
D.VALUE 



Labels of Instruction or Data. The label assigned to an instruction or a data definition has as its value the 
address of the first byte of the instruction or data. Instructions elsewhere in the program can refer to this 
address by its symbolic label name. 



Label 
HERE: 



Opcode 
IMP 



Operand Comments 

THERE :|UMP TO INSTRUCTION AT THERE 



THERE: 



MVI 



D,9FH 



Expressions. All of the operand types discussed previously can be combined by operators to form an expression. 
In fact, the example given for the location counter ($+6) is an expression that combines the location counter 
with the decimal number 6. 

Because the rules for coding expressions are rather extensive, further discussion of expressions is deferred until 
later in this chapter. 



2-6 



Chapter 2. Assembly Language Concepts 



Instructions as Operands. One operand type was intentionally omitted from the list of operand field infor- 
mation: Instructions enclosed in parentheses may appear in the operands field. The operand has the value of 
the left-most byte of the assembled instruction. 



Label Opcode Operand 

INS; DB (ADD C) 



The statement above defines a byte with the value 81 H (the object code for an ADD C instruction). Such 
coding is typically used where the object program modifies itself during execution, a technique that is strongly 
discouraged. 



Register-Type Operands. Only instructions that allow registers as operands may have register-type operands. 
Expressions containing register-type operands are flagged as errors. Thus, an instruction like 

JMP A 

is flagged as an illegal use of a register. 

The only assembler directives that may contain register-type operands are EQU, SET, and actual parameters in 
macro calls. Registers can be assigned alternate names only by EQU or SET. 

TWO'S COMPLEMENT REPRESENTATION OF DATA 

Any 8-bit byte contains one of the 256 possible combinations of zeros and ones. Any particular combination may 
be interpreted in a number of ways. For example, the code IFH may be interpreted as an instruction (Rotate 
Accumulator Right Through Carry), as the hexadecimal value IF, the decimal value 31, or simply the bit 
pattern 00011111. 

Arithmetic instructions assume that the data bytes upon which they operate are in the 'two's complement' 
format. To understand why, let us first examine two examples of decimal arithmetic: 

35 35 

-12 -(;88 

23 123 

Notice that the results of the two examples are equal if we disregard the carry out of the high order position in 
the second example. The second example illustrates subtraction performed by adding the ten's complement of 
the subtrahend (the bottom number) to the minuend (the top number). To form the ten's complement of a 
decimal number, first subtract each digit of the subtrahend from 9 to form the nine's complement; then add one 
to the result to form the ten's complement. Thus, 99—12=87; 87-^l=88, the ten's complement of 12. 

The ability to perform subtraction with a form of addition is a great advantage in a computer since fewer cir- 
cuits are required. Also, arithmetic operations within the computer are binary, which simplifies matters even more. 



2-7 



Chapter 2. Assembly Language Concepts 



The processor forms the two's complement of a binary value simply by reversing the value of each bit and then 
adding one to the result. Any carry out of the high order bit is ignored when the complement is formed. Thus, 
the subtraction shown previously is performed as follows; 

35 = 0010 0011 0010 0011 

-J^ = 0000 1 1 00 = 1 1 1 1 001 1 +1111 010 

23 + 1 1 0001 0111 =23 

nil 0100 

Again, by disregarding the carry out of the high order position, the subtraction is performed through a form of 
addition. However, if this operation were performed by the 8080 or the 8085, the carry flag would be set OFF 
at the end of the subtraction. This is because the processors complement the carry flag at the end of a subtract 
operation so that it can be used as a 'borrow' flag in multibyte subtractions. In the example shown, no borrow 
is required, so the carry flag is set OFF. By contrast, the carry flag is set ON if we subtract 35 from 12: 

12 = 0000 1100 0000 1100 

-35 = 0010 0011=1101 1100 +1101 110 1 

+ 1 1110 1001 = 233 or 105 



1101 1101 



In this case, the absence of a carry indicates that a borrow is required from the next higher order byte, if any. 
Therefore, the processor sets the carry flag ON. Notice also that the result is stored in a complemented form. 
If you want to interpret this result as a decimal value, you must again form its two's complement; 

1110 1001 = 0001 0110 

H; 1 

0001 0111 =23 

Two's complement numbers may also be signed. When a byte is interpreted as a signed two's complement number, 
the high order bit indicates the sign. A zero in this bit indicates a positive number, a one a negative number. The 
seven low order bits provide the magnitude of the number. Thus, 0111 1111 equals +127. 

At the beginning of this description of two's complement arithmetic, it was stated that any 8-bit byte may con- 
tain one of the 256 possible combinations of zeros and ones. It must also be stated that the proper interpretation 
of data is a programming responsibility. 

As an example, consider the compare instruction. The compare logic considers only the raw bit values of the 
items being compared. Therefore, a negative two's complement number always compares higher than a positive 
number, because the negative number's high order bit is always ON. As a result, the meanings of the flags set by 
the compare instruction are reversed. Your program must account for this condition. 



2-8 



Chapter 2. Assembly Language Concepts 



SYMBOLS AND SYMBOL TABLES 

Symbolic Addressing 

if you have never done symbolic programming before, the following analogy may help clarify the distinction 
between a symbolic and an absolute address. 

The locations in program memory can be compared to a cluster of post office boxes. Suppose Richard Roe 
rents box 500 for two months. He can then ask for his letters by saying 'Give me the mail in box 500,' or 
'Give me the mail for Roe.' If Donald Smith later rents box 500, he too can ask for his mail by either box 
number 500 or by his name. The content of the post office box can be accessed by a fixed, absolute address 
(500) or by a symbolic, variable name. The postal clerk correlates the symbolic names and their absolute values 
in his log book. The assembler performs the same function, keeping track of symbols and their values in a 
symbol table. Note that you do not have to assign values to symbolic addresses. The assembler references its 
location counter during the assembly process to calculate these addresses for you. (The location counter does 
for the assembler what the program counter does for the microcomputer. It tells the assembler where the next 
instruction or operand is to be placed in memory.) 

Symbol Characteristics 

A symbol can contain one to six alphabetic (A-Z) or numeric (0-9) characters (with the first character alphabetic) 
or the special character '?' or '@'. A dollar sign can be used as a symbol to denote the value currently in the 
location counter. For example, the command 

JMP $+6 

forces a jump to the instruction residing six memory locations higher than the JMP instruction. Symbols of the 
form '??nnn' are generated by the assembler to uniquely name symbols local to macros. 

The assembler regards symbols as having the following attributes: reserved or user-defined; global or limited; 
permanent or redefinable; and absolute or relocatable. 



Reserved, User-Defined, and Assembler-Generated Symbols 

Reserved symbols are those that already have special meaning to the assembler and therefore cannot appear as 
user-defined symbols. The mnemonic names for nnachine instructions and the assembler directives are all reserved 
symbols. 



2-9 



Chapter 2. Assembly Language Concepts 



The following instruction operand symbols are also reserved; 



Symbol 



Meaning 



A 

B 

C 

D 

E 

H 

L 

SP 

PSW 

M 

STACK 

MEMORY 



Location counter reference 

Accumulator register 

Register B or register pair B and C 

Register C 

Register D or register pair D and E 

Register E 

Register H or register pair H and L 

Register L 

Stack pointer register 

Program status word (Contents of A and status flags) 

Memory reference code using address in H and L 

Special relocatability feature 

Special relocatability feature 



NOTE 

The STACK and MEMORY symbols are fully discussed 
in Chapter 4. 

User-defined symbols are symbols you create to reference instruction and data addresses. These symbols are 
defined when they appear in the label field of an instruction or in the name field of EQU, SET, or MACRO 
directives (see Chapters 4 and 5). 

Assembler-generated symbols are created by the assembler to replace user-defined symbols whose scope is limited 
to a macro definition. 



Global and Limited Symbols 

Most symbols are global. This means that they have meaning throughout your program. Assume, for example, 
that you assign the symbolic name RTN to a routine. You may then code a jump or a call to RTN from any 
point in your program. If you assign the symbolic name RTN to a second routine, an error results since you 
have given multiple definitions to the same name. 

Certain symbols have meaning only within a macro definition or within a call to that macro; these symbols are 
'local' to the macro. Macros require local symbols because the same macro may be used many times in the 
program. If the symbolic names within macros were global, each use of the macro (except the first) would cause 
multiple definitions for those symbolic names. 

See Chapter 5 for additional information about macros. 



2-10 



Chapter 7. Assembly Language Concepts 



Permanent and Redefinable Symbols 

Most symbols arc permanenl since their value cannot change during the assembly operation. Only symbols 
defined with the SET and MACRO assembler directives are redefinable. 



Absolute and Relocatable Symbols 

An important attribute of symbols with this assembler is that of relocatability. Relocatable programs are 
assembled relative to memory location /-ero. These programs are later relocated to some other set of memory 
locations. Symbols with addresses that change during relocation are relocatable symbols. Symbols with 
addresses that do not change during relocation are absolute symbols. This distinction becomes important when 
the symbols are used within expressions, as will be explained later. 

External and public symbols are special types of relocatable symbols. These symbols are required to establish 
program linkage when several relocatable program modules are bound together to form a single application 
program. External symbols are those used in the current program module, but defined in another module. 
Such symbols must appear in an EXTRN statetiient, or the assembler will flag them as undefined. 

Conversely, PUBLIC symbols are defined in the current program module, but may be accessed by other 
modules. The addresses for these symbols are resolved- when the modules are bound together. 

Absolute and relocatable symbols may both appear in a relocatable module. References to any of the assembler- 
defined registers A through E, H and L, PSW, SP, and M are absolute since they refer to hardware locations. 
But these references arc valid in any module. 



ASSEMBLY-TIME EXPRESSION EVALUATION 

An expression is a combination of numbers, symbols, and operators. Each element of an expression is a term. 

Expressions, like symbols, may be absolute or relocatable. For the sake of readers who do not require the 
relocation feature, absolute expressions are described first. However, users of relocation should read all the 
following. 

Operators 

The assembler includes five groups of operators which permit the following assembly-lime operations; arithmetic 
operations, shift operations, logical operations, compare operations, and byte isolation operations. It is important 
to keep in mind that these are all assembly-time operations. Once the assembler has evaluated an expression, it 
becomes a permanent part of your program. Assume, for example, that your program defines a list of ten con- 
stants starting at the label LIST; the following instruction loads the address of the seventh item in the list into 
the H and L registers; 

LXI H,LlST+6 

Notice that LIST addresses the first item, LIST+1 the second, and so on. 



2-11 



Chapter 2. Assembly Language Concepts 

Arithmetic Operators 

The arithmetic operators are as follows: 
Operator 



I 
MOD 



Meaning 

Unary or binary addition 

Unary or binary subtraction 

Multiplication 

Division. Any remainder is discarded (7/2=3). 

Division by zero causes an error. 

Modulo. Result is the remainder caused by a 

division operation. (7 MOD 3=1) 



Examples: 

The follov/ing expressions generate the bit pattern for the ASCII character A: 

5+30*2 

(25/5)+30='^2 

5+(-30*-2) 

Notice that the MOD operator must be separa.ted from its operands by spaces: 

NUMBR MOD 8 

Assuming that NUMBR has the value 25, the previous expression evaluates to the value 1. 



Siiift Operators 

The shift operators are as follov/s: 
Operator 
y SHR X 
y SHL X 



Meaning 

Shift operand 'y' to the right 'x' bit positions. 

Shift operand 'y' to the left 'x' bit positions. 



The shift operators do not wraparound any tiits shifted out of the byte. Bit positions vacated by the shift 
operation are zero-filled. Notice that the shift operator must be separated from its operands by spaces. 

Example: 

Assume that NUMBR has the value 0101 0101. The effects of the shift operators is as follows: 



NUMBR SHR 



NUMBR SHL 1 



0001 0101 



1010 1010 



2-12 



Chapter 2. Assembly Language Concepts 



Notice that a shift one bit position to the left has the effect of multiplying a value by two; a shift one bit 
position to the right has the effect of dividing a value by two. 



Logical Operators 

The logical operators are as follows: 
Operator 
NOT 



AND 

OR 

XOR 



Meaning 

Logical one's complement 

Logical AND (=1 if both ANDed'bits are 1) 

Logical OR (=1 if either ORed bit is 1 ) 

Logical EXCLUSIVE OR (=1 if bits are different) 



The logical operators act only upon the least significant bit of values involved in the operation. Also, these 
operators are commonly used in conditional IF directives. These directives are fully explained in Chapter 4. 

Example: 

The following IF directive tests the least significant bit of three items. The assembly language code that follows 
the IF is assembled only if the condition is TRUE. This means that all three fields must have a one bit in the 
least significant bit position. 

IF FLD1 AND FLD2 AND FLD3 



Compare Operators 

The compare operators are as follows: 
Operator 

EQ 

NE 
LT 
LE 
GT 
GE 
NUL 



Meaning 

Equal 

Not equal 

Less than 

Less than or equal 

Greater than 

Greater than or equal 

Special operator used to test for null (missing) macro 

parameters 



2-13 



Chapter 2. Assembly Language Concepts 



The compare operators yield a yes-no result. Thus, if the evaluation of the relation is TRUE, the value of the 
result is all ones. If false, the value of the resjit is all zeros. Relational operations are based strictly on magni- 
tude comparisons of bit values. Thus, a two's complement negative number (which always has a one in its high 
order bit) is greater than a two's complement positive number (which always has a zero in its high order bit). 

Since the NUL operator applies only to the nacro feature, NUL is described in Chapter 5. 

The compare operators are commonly used in conditional IF directives. These directives are fully explained in 
Chapter 4. 

Notice that the compare operator must be separated from its operands by spaces. 

Example: 

The following IF directive tests the values of FLDl and FLD2 for equality. If the result of the comparison is 
TRUE, the assembly language coding following the IF directive is assembled. Otherwise, the code is skipped over. 

IF FLDl EQ FLD2 



Byle Isolation Operators 

The byte isolation operators are as follows; 

Operator Meaning 

HIGH Isolate high-order 8 bits of 16-bit value 

LOW Isolate low-order 8 bits of 16-bit value. 

The assembler treats expressions as 16-bit acidresses. In certain cases, you need to deal only with a part of an 
address, or you need to generate an 8-bit va ue. This is the function of the HIGH and LOW operators. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 
HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOW operator and issues an error message. 

NOTE 

Any program segment containing a symbol used as the 
argument of a HIGH operator should be located only on 
a page boundary. This is done using the PAGE option 
with the CSEG or DSEG directives described in Chapter 
4. Carries are not propagated from the low-order byte 
when the assembler object code is relocated and the 
carry flag will be lost. Using PAGE ensures that this 
flag is 0. 

2-14 



Chapter 2. Assembly Language Concepts 



Examples: 

Assume that ADRS is an address manipulated at assembly-time for building tables or lists of items that must all 

be below address 255 in memory. The following IF directive determines whether the high-order byte of ADRS 
is zero, thus indicating that the address is still les5 han 256: 

IF HIGH ADRS EQ 



Permissible Range of Values 

internally, the assembler treats each term of an expression as a two-byte, 16-bit value. Thus, the maximum 
range of values is OH through OFFFFH. All arithmetic operations are performed using unsigned two's comple- 
ment arithmetic. The assembler performs no overflow detection for two-byte values, so these values are evaluated 
modulo 64K. 

Certain instructions require that their operands be an eight-bit value. Expressions for these instructions must 
yield values in the range 256 through -t-255. The assembler generates an error message if an expression for one 
of these instructions yields an out-of-range value. 



NOTE 

Only instructions that allow registers as operands may have 
register-type operands. Expressions containing register-type 
operands are flagged as errors. The only assembler directives 
that may contain register-type operands are EQU, SET, and 
actual parameters in macro calls. Registers can be assigned 
alternate names only by EQU or SET. 



Precedence of Operators 

Expressions are evaluated left to right. Operators with higher precedence are evaluated before other operators 
that immediately precede or follow them. When two operators have equal precedence, the left-most is evaluated 
first. 

Parentheses can be used to override normal rules of precedence. The part of an expression enclosed in paren- 
theses is evaluated first. If parentheses are nested, the innermost are evaluated first. 

15/3-^18/9 =5-^2 = 7 

15/(3 + 18/9) = 15/(3 -^ 2) = 15/5 = 3 



2-15 



Chapter 2. Assembly Language Concepts 



The followina 



I describes the classes of operators in order of precedence: 



Parenthesized expressions 

NUL 

HIGH, LOW 

Multiplication/Division; *, /, (VIOD, SHL, SHR 

Addition/Subtraction: ^ , - (unary and binary) 

Relational Operators: EQ, LT, LE, GT, GE, NE 

Logical NOT 

Logical AND 

Logical OR, XOR 

The relational, logical, and HIGH/LOW operators must be separated fron-i their operands by at least one blank. 



Relocatable Expressions 

Determining the relocatability of an expression requires that you understand the relocatability of each term used 
in the expression. This is easier than it sounds since the number of allowable operators is substantially reduced. 
But first it is necessary to know what determiines whether a symbol is absolute or relocatable. 

Absolute symbols can be defined two ways: 

• A symbol that appears in a label field when the ASEG directive is in effect is an absolute symbol. 

• A symbol defined as equivalent tj an absolute expression using the SET or EQU directive is an 
absolute symbol. 

Relocatable symbols can be defined a number of ways: 



• A symbol that appears in a label field when the DSEG or CSEG directive is in effect is a relocatable 
symbol. 

• A symbol defined as equivalent to a relocatable expression using the SET or EQU directive is 
relocatable. 

• The special assembler symbols STACK and MEMORY are relocatable. 

• External symbols are considered relocatable. 

• A reference to the location counter (specified by the $ character) is relocatable when the CSEG or 
DSEG directive is in effect. 



The expressions shown in the following list <ire the only expressions that yield <i relocatable result. Assume 
ABS is an absolute symbol and RELOC is a relocatable symbol: 

ABS + RELOC 
RELOC + ABS 
RELOC ABS 

"'^"') RELOC + ABS 

LOW ) 

"'^"] RELOC ABS 
I nw 



that 



LOW ; 
RELOC + 

RELOC 



{ HIGH 

I, LOW 

{ HIGH 

\ LOW 



ABS 



ABS 



2-16 



Chapter 2. Assembly Language Concepts 



Remember Ihat numbers are absolute terms. Thus the expression RELOC 100 is legal, but 100 RELOC 
is not. 

When two relocatable symbols have both been defined with the same type ol rciocal.ibility, they may .ippear in 
certain expressions that yield an absolute result. Symbols have the same type of relocatability when both are 
relative to the CSEG location counter, both arc relative to the DSEG loc.ition counter, both are relative to 
MEMORY, or both are relative to STACK. The following expressions arc valid and produce absolute results: 



RELOCl - REL0C2 
/ 



RELOCl 



EO 

LT 
LE 
GT 
GE 
vNE/ 



REL0C2 



Relocatable symbols may not appear in expressions with any other operators. 

The following list shows all possible combinations of operators with absolute and relocatable terms. An A in the 
table indicates that the resulting address is absolute; an R indicates a relocatable address; an I indicates an 
illegal combination. Notice that only one term may appear with the last five operators in the list. 



Operator 


X absolute 
Y absolute 


X absolute 
Y relocatable 


X relocatable 
Y absolute 


X relocatable 
Y relocatable 


X + 


Y 


A 


R 


R 


i 


X 


Y 


A 




R 


A 


X * 


Y 


A 








X / 


Y 


A 








X MOD 


Y 


A 








X SHE 


Y 


A 








X SHR 


Y 


A 








X EQ 


Y 


A 






A 


X LT 


Y 


A 






A 


X LE 


Y 


A 






A 


X GT 


Y 


A 






A 


X GE 


Y 


A 






A 


X NE 


Y 


A 






A 


X AND 


Y 


A 






1 


X OR 


Y 


A 




1 


1 


X XOR 


Y 


A 






1 


NOT 


X 


A 








HIGH 


X 


A 




R 




LOW 


X 


A 




R 




unary+ 


X 


A 




R 




unary 


X 


A 




1 





2-17 



Chapter 2. Assembly Language Concepts 



Chaining of Symbol Definitions 

The ISiS-il 8080/8085 Macro Assembler is essentially a 2-pass assembler. All symbol table entries must be 
resolvable in two passes. Therefore, 

X EQU Y 

Y EQU 1 

is legal, but in the series 

X EQU Y 

Y EQU Z 
Z EQU 1 

the first line is illegal as X cannot be resolved in two passes and remains undefined. 



2-18 



3. INSTRUCTION SET 



HOW TO USE THIS CHAPTER 

This chapter is a dictionary of 8080 and 8085 instructions. The instruction descriptions are listed alphabetically 
for quick reference. Each description is complete so that you are seldom required to look elsewhere for addition- 
al information. 

This reference format necessarily requires repetitive information. If you are reading this manual to learn about 
the 8080 or the 8085, do not try to read this chapter from ACI (add immediate with Carry) to XTHL (exchange 
top of stack with H and L registers). Instead, read the description of the processor and instruction set in 
Chapter 1 and the programming examples in Chapter 6. When you begin to have questions about particular 
instructions, look them up in this chapter. 



TIMING INFORMATION 

The instruction descriptions in this manual do not explicitly state execution timings. This is because the basic 
operating speed of your processor depends on the clock frequency used in your system. 

The 'state' is the basic unit of time measurement for the processor. A state may range from 480 nanoseconds 
(320 nanoseconds on the 8085) to 2 microseconds, depending on the clock frequency. When you know the 
length of a state in your system, you can determine an instruction's basic execution time by multiplying that 
figure by the number of states required for the instruction. 

Notice that two sets of cycle/state specifications are given for 8085 conditional call and jump instructions. This 
is because the 8085 fetches the third instruction byte only if it is actually needed; i.e., the specified condition 
is satisfied. 

This basic timing factor can be affected by the operating speed of the memory in your system. With a fast 
clock cycle and a slow memory, the processor can outrun the memory. In this case, the processor must wait 
for the memory to deliver the desired instruction or data. In applications with critical timing requirements, this 
wait can be significant. Refer to the appropriate manufacturer's literature for memory timing data. 



3-1 



Chapter 3. Instruction Set 



ACI 



ADD IMMEDIATE WITH CARRY 



ACI adds the contents of the second instruction byte and the carry bit to the contents of the accumulator and 
stores the result in the accumulator. 



Opcode 



Operand 



ACI 



data 



The operand specifies the actual data to be added to the accumulator except, of course, for the carry bit. Data 
may be in the form of a number, an ASCII constant, the label of a previously defined value, or an expression. 
The data may not exceed one byte. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 
HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOW operator and issues an error message. 



1 



10 1 



1 



1 







data 



Cycles: 


2 


States: 


7 


Addressing: 


immediate 


Flags: 


Z,S,P,CY,AC 



Example: 

Assume that the accumulator contains the value 14H and that the carry bit is set to one. The instruction ACI 66 
has the following effect: 



Accumulator = 14H 

Immediate data = 42H 

Carry 



00010100 
01000010 

1 

01010111 



57H 



ADC 



ADD WITH CARRY 



The ADC instruction adds one byte of data plus the setting of the carry flag to the contents of the accumulator. 
The result is stored in the accumulator. ADC then updates the setting of the carry flag to indicate the outcome 
of the operation. 

The ADC instruction's use of the carry bit enables the program to add multi-byte numeric strings. 



3-2 



Chapter 3. Instruction Set 



Add Register to Accumulator with Carry 



Opcode 



Operand 



ADC 



reg 



The operand must specify one of the registers A through E, H or L. This instruction adds the contents of the 
specified register and the carry bit to the accumulator and stores the result in the accumulator. 



10 1 


s s s 



Cycles: 


1 


States: 


4 


Addressings: 


register 


Flags: 


Z,S,P,CY,AC 



Add Memory to Accumulator with Carry 



Opcode 



Operand 



ADC 



M 



This instruction adds the contents of the memory location addressed by the H and L registers and the carry 
bit to the accumulator and stores the result in the accumulator. M is a symbolic reference to the H and L 
registers. 



10 1110 



Cycles: 
States: 
Addressing: 
Flags: 



2 

7 

register indirect 

Z,S,P,CY,AC 



Example: 

Assume that register C contains 3DH, the accumulator contains 42H, and the carry bit is set to zero. The 
instruction ADC C performs the addition as follows: 

3DH = 00111101 
42H = 01000010 

CARRY = 

01111111 = 7FH 

The condition flags are set as follows: 



Carry 


= 


Sign 


= 


Zero 


= 


Parity 


= 


Aux. Carry 


= 



3-3 



Chapter 3. Instruction Set 



If the carry bit is set to one, the instruction has the following results: 



3DH = 


00111101 


42H = 


01000010 


CARRY = 


1 




10000000 


Carry 


= 


Sign 


= 1 


Zero 


= 


Parity 


- 


Aux. Carry 


= 1 



= 80H 



ADD 



ADD 



The ADD instruction adds one byte of data to the contents of the accumulator. The result is stored in the 
accumulator. Notice that the ADD instruction excludes the carry flag from the addition but sets the flag to 
indicate the outcome of the operation. 

Add Register to Register 



Opcode 



Operand 



ADD 



reg 



The operand must specify one of the registe's A through E, H or L. The instruction adds the contents of the 
specified register to the contents of the accumulator and stores the result in the accumulator. 



Add From Memory 



10 


s s s 



Cycles: 


1 


States: 


4 


Addressing: 


register 


Flags: 


Z,S,P,CY,AC 



Opcode 
ADD 



Operand 
M 



This instruction adds the contents of the memory location addressed by the H and L registers to the contents of 
the accumulator and stores the result in the accumulator. M is a symbolic reference to the H and L registers. 



10 1 10 



34 



Cycles: 


2 


States: 


7 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



Chapter 3. Instruction Set 



Examples: 

Assume that the accumulator contains 6CH and register D contains 2EH. The instruction ADD D performs the 
addition as follows: 

2EH = 00101110 
6CH = 01101100 



9AH = 10011010 



The accumulator contains the value 9AH following execution of the ADD D instruction. The contents of the D 
register remain unchanged. The condition flags are set as follows: 



Carry 


= 


Sign 


= 1 


Zero 


= 


Parity 


= 1 


Aux. Carry 


= 1 



The following instruction doubles the contents of the accumulator: 

ADD A 



ADI 



ADD IMMEDIATE 



ADI adds the contents of the second instruction byte of the contents of the accumulator and stores the result 
in the accumulator. 



Opcode 
ADI 



Operand 
data 



The operand specifies the actual data to be added to the accumulator. This data may be in the form of a number, 
an ASCII constant, the label of a previously defined value, or an expression. The data may not exceed one byte. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either 
the HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOV/ operator and issues an error message. 



110 110 



data 



Cycles: 


2 


States: 


7 


Addressing: 


immediate 


Flags: 


Z,S,P,CY,AC 



3-5 



Chapter 3. Instruction Set 



Example: 

Assume that ihe accumulator contains the value 14H. The instruction ADI 66 has the following effect. 

Accumulator = 14H = 00010100 
Immediate data = 42H = 01000010 

01010110 = 56H 

Notice that the assembler converts the decimal value 66 into the hexadecimal value 42. 



ANA 



LOGICAL AND WITH ACCUMULATOR 



ANA performs a logical AND operation using the contents of the specified byte and the accumulator. The result 
is placed in the accumulator. 

Summary of Logical Operations 

AND produces a one bit in the result only w:^en the corresponding bits in the test data and the mask data are 
ones. 

OR produces a one bit in the result Vi^hen the corresponding bits in either the test data or the mask data are 
ones. 

Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are 
different; i.e., a one bit in either the test data or the mask data - but not both — produces a one bit in the 
result. 



AND 



OR 



EXCLUSIVE OR 



1010 1010 1010 1010 1010 1010 

0000 nil 0000 1 1 1 1 0000 ini 

0000 1010 1010 1111 1010 0101 



AND Register with Accumulator 



Opcode Operand 



ANA 



reg 



The operand must specify one of the registers A through E, H or L. This instruction ANDs the contents of the 
specified register with the accumulator and stores the result in the accumulator. The carry flag is reset to zero. 



10 10 


s s s 



Cycles: 


1 


States: 


4 


Addressing: 


register 


Flags: 


Z,S,P,CY,AC 



3-6 



Chapter 3. Instruction Set 



AND Memory with Accumulator 

Opcode Operand 

ANA M 



This instruction ANDs the contents of the specified memory location with the accumulator and stores the result 
in the accumulator. The carry flag is reset to zero. 



10 10 110 



Cycles: 2 

States: 7 

Addressing: register indirect 

Flags: Z,S,P,CY,AC 



Example: 



Since any bit ANDed with a zero produces a zero and any bit ANDed with a one remains unchanged, AND is 
frequently used to zero particular groups of bits. The following example ensures that the high-order four bits of 
the accumulator arc zero, and the low-order four bits are unchanged. Assume that the C register contains OFH: 



Accumulator = 1111 110 = OFCH 

C Register = 1111 = OFH 
110 0= OCH 



ANI AND IMMEDIATE WITH ACCUMULATOR 

ANl performs a logical AND operation using the contents of the second byte of the instruction and the accumu- 
lator. The result is placed in the accumulator. ANI also resets the carry flag to zero. 

Opcode Operand 

ANI data 

The operand must specify the data to be used in the AND operation. This data may be in the form of a number, 
an ASCII constant, the label of some previously defined value, or an expression. The data may not exceed one 
byte. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 
HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOW operator and issues an error message. 



3-7 



Chspter 3. Instruction Set 



1110 110 



data 



Cycles: 


2 


States: 


7 


Addressing: 


immediate 


Flags: 


Z,S,P,CY,AC 



Summary of Logical Operations 

AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are 
ones. 

OR produces a one bit in the result when the corresponding bits in either the test data or the mask data are 
ones. 

Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are 
different; i.e., a one bit in either the test data or the mask data -- but not both produces a one bit in the 
result. 



AND 



OR 



EXCLUSIVE OR 



1010 1010 
0000 1111 
0000 1010 



1010 1010 
0000 1 1 1 1 

1010 nil 



1010 1010 

0000 nil 

1010 0101 



Example: 

The following instruction is used to reset OFF bit six of the byte in the accumulator: 

AN I loniniB 

Since any bit ANDcd with a one remains unchanged and a bit ANDed with a zero is rest to zero, the ANI 
instruction shown above sets bit six OFF and leaves the others unchanged. This technique is useful when a 
program uses individual bits as status flags. 



CALL 



CALL 



The CALL instruction combines functions of the PUSH and JMP instructions. CALL pushes the contents of the 
program counter (the address of the next sequential instruction) onto the stack and then jumps to the address 
specified in the CALL instruction. 

Each CALL instruction or one of its variants implies the use of a subsequent RET (return) instruction. When a 
call has no corresponding return, excess addresses are built up in the stack. 



3-8 



Chapter 3. Instruction Set 



Opcode Operand 

CALL address 



The address may be specified as a number, a label, or an expression. (The label is mosl common.) The assembler 
inverts the high and low address bytes when it assembles the instruction. 



1 


1 


11 





1 


low addr 


high addr 



Cycles; 
States: 
Addressing: 
Flags: 



17 (18 on 8085) 
immediate/register indirect 
none 



Example: 

When a given coding sequence is required several times in a program, you can usually conserve memory by coding 
the sequence as a subroutine invoked by the CALL instruction or one of its variants. For example, assume that 
an application drives a six-digit LED display; the display is updated as a result of an operator input or because 
of two different calculations that occur in the program. The coding required to drive the display can be included 
in-line at each of the three points where it is needed, or it can be coded as a subroutine. If the label DISPLY is 
assigned to the first instruction of the display driver, the following CALL instruction is used to invoke the 
display subroutine; 



CALL 



DISPLY 



This CALL instruction pushes the address of the next program instruction onto the stack and then transfers 
control to the DISPLY subroutine. The DISPLY subroutine must execute a return instruction or one of its 
variants to resume normal program flow. The following is a graphic illustration of the effect of CALL and return 
instructions; 



CALL- 



CALL 



CALL 



DISPLY 



DISPLY; 




DISPLY- - 



DISPLY 



-^*-*-RET 



Consideration for Using Subroutines 

The larger the code segment to be repeated and the greater the number of repetitions, the greater the potential 
memory savings of using a subroutine. Thus, if the display driver in the previous example requires one hundred 



3-9 



Chipter 3. Imtruction Set 



bytes, coding it in-line would require three hundred bytes. Coded as a subroutine, it requires one hundred bytes 
plus nine byles for the three CALL instructions. 

Notice that subroutines require the use of the stack. This requires the application to include random access 
memory for the stack. When an application has no other need for random access memory, the system designer 
might elect to avoid the use of subroutines. 



cc 



CALL IF CARRY 



The CC instruction combines functions of the JC and PUSH instructions. CC tests the setting of the carry flag. 
If the flag is set to one, CC pushes the contents of the program counter onto the stack and then jumps to the 
address specified in bytes two and three of the CC instruction. If the flag is reset to zero, program execution 
continues with the next sequential instruction. 



Opcode 



Operand 



CC 



address 



Although the use of a label is most common, the address may also be specified as a number or expression. 



1 


1 


111 












low addr 






high addr 



Cycles: 3 or 5 (2 or 5 on 8085) 

States: 11 or 17 (9 or 18 on 8085) 

Addressing: immediate/register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



CM 



CALL IF MINUS 



The CM instruction combines functions of the JM and PUSH instructions. CM tests the setting of the sign flag 
If the flag is set to one (indicating that the contents of the accumulator are minus), CM pushes the contents 
of the program counter onto the slack and then jumps to the address specified by the CM instruction. If the 
flag is set to zero, program execution simply continues with the next sequential instruction. 



Opcode 
CM 



Operand 
address 



3-10 



Chapter 3. Instruction Set 



Although the use of a label is most common, the address may also be specified as a number or an expression. 



1 


1 


1111 








low addr 


high addr 



Cycles: 3 or 5 (2 or 5 on 8085) 

States: 11 or 17 (9 or 18 on 8085) 

Addressing: immediate/register indirect 

Flags: none 



Example: 



For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



CMA 



COMPLEMENT ACCUMULATOR 



CMA complements each bit of the accumulator to produce the one's complement. All condition flags remain 
unchanged. 



Opcode 



Operand 



CMA 



Operands are not permitted with the CMA instruction. 



10 1111 



Cycles: 


1 


States: 


4 


Flags: 


none 



To produce the two's complement, add one to the contents of the accumulator after the CMA instructions has 
been executed. 



Example: 

Assume that the accumulator contains the value 51 H; when complemented by CMA, it becomes OAEH: 



51 H 
OAEH 



01010001 
10101110 



3-11 



Chapter 3. Instruction Set 



CMC 



COMPLEMENT CARRY 



If the carry flag equals zero, CMC sels it to one. If the carry flag is one, CMC resets it to zero. All other flags 
remain unchanged. 



Opcode 



Operand 



CMC 



Operands are not permitted with the CMC instruction. 



11 



1 1 



Cycles: 


1 


States: 


4 


Flags: 


CY only 



Example: 

Assume that a program uses bit 7 of a byte to control whether a subroutine is called. To test the bit, the pro- 
gram loads the byte into the accumulator, rotates bit 7 into the carry flag, and executes a CC (Call if Carry) 
instruction. Before returning to the calling program, the subroutine reinitializes the flag byte using the following 
code: 



CMC 
RAR 
RET 



SET BIT 7 OFF 

ROTATE BIT 7 INTO ACCUMULATOR 

RETURN 



CMP 



COMPARE WITH ACCUMULATOR 



CMP compares the specified byte with the contents of the accumulator ,ind indicates the result by setting the 
carry and zero flags. The values being compared remain unchanged. 

The zero flag indicates equality. No carry indicates that the accumulator is greater than the specified byte; a 
carry indicates that the accumul.itor is less than the byte. However, the meaning of the carry flag is reversed 
when the values have different signs or one of the values is complemented. 

The program tests the condition flags using one of the condition.il Jump, Call, or Return instructions. For 
example, )Z (Jump if Zero) tests for equality. 

Functional Description: 

Comparisons are performed by subtracting the specified byte from the contents of the accumulator, which 
is why the zero and carry flags indicate the result. This subtraction uses the processor's internal registers 
so that source data is pteserved. Because subtraction uses two's complement addition, the CMP instruction 
recomplements the carry flag generated by the subtraction. 



3-12 



Chapter 3. Instruction Set 



Compare Register with Accumulator 



Opcode 



Operand 



CMP reg 

The operand must name one of the registers A through E, H or L. 





1 


1 


1 1 


s s s 




Cycles: 
States: 
Addressing: 
Flags: 




agister 
2,S,P,CY,AC 


Compare IVIemory wit In Accumulator 








Opcode 




Operand 


CMP 






M 





This instruction compares the contents of the memory location addressed by the H and L registers with the 
contents of the accumulator. M is a symbolic reference to the H and L register pair. 







11110 



Cycles: 


2 


States: 


7 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



Example 1 : 

Assume that the accumulator contains the value OAH and register E contains the value 05H. The instruction 
CMP E performs the following internal subtraction (remember that subtraction is actually two's complement 
addition): 



Accumulator 
+(-E Register) 



00001010 

union 

00000101 +( -carry) 



After the carry is complemented to account for the subtract operation, both the zero and carry bits are zero, 
thus indicating A greater than E. 

Example 2: 

Assume that the accumulator contains the value — IBH and register E contains 05H: 



Accumulator 
+( "E Register) 



1100101 
1111011 
1100000 +(~-carry) 



3-13 



Chapter 3. Instruction Set 



After the CMP instruction recomplements the carry flag, both the carry flag and zero flag are zero. Normally 
this indicates that the accumulator is greater than register E. However, the meaning of the carry flag is reversed 
since the values have different signs. The user program is responsible for proper interpretation of the carry flag. 



CNC 



CALL IF NO CARRY 



The CNC instruction combines functions of the )NC and PUSH instructions. CNC tests the setting of the carry 
flag. If the flag is set to zero, CNC pushes the contents of the program counter onto the stack and then jumps 
to the address specified by the CNC instruction. If the flag is set to one, program execution simply continues 
with the next sequential instruction. 



Opcode 



Operand 



CNC 



address 



Although the use of a label is most common, the address may also be specified as a number or an expression. 



110 10 1 








low addr 


high addr 



Cycles: 3 or 5 (2 or 5 on 8085) 

States: 1 1 or 17 (9 or 18 on 8085) 

Addressing: immediate/register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



CNZ 



CALL IF NOT ZERO 



The CNZ instruction combines fimctions of the JNZ and PUSH instructions. CNZ tests the setting of the zero 
flag. If the flag is off (indicating that the contents of the accumulator are other than zero), CNZ pushes the 
contents of the program counter onto the stack and then jumps to the address specified in the instruction's 
second and third bytes. If the flag is set to one, program execution simply continues with the next sequential 
instruction. 

Opcode Operand 

CNZ address 

Although the use of a label is most common, the address may also be specified as a number or an expression. 



3-14 



Chapter 3. Instruction Set 



1 


1 


1 








low addr 


high addr 



Cycles: 3 or 5 (2 or 5 on 8085) 

States: 11 or 17 (9 or 18 on 8085) 

Addressing: immediate/register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



CP 



CALL IF POSITIVE 



The CP instruction combines features of the JP and PUSH instructions. CP tests the setting of the sign flag. If 
the flag is set to zero (indicating that the contents of the accumulator are positive), CP pushes the contents of 
the program counter onto the stack and then jumps to the address specified by the CP instruction. If the flag 
is set to one, program execution simply continues with the next sequential instruction. 



Opcode 
CP 



Operand 
address 



Although the use of a label is more common, the address may also be specified as a number or an expression. 



1 


1 


1 


1 1 








low address 


high addr 



Cycles: 3 or 5 (2 or 5 on 8085) 

States: 11 or 17 (9 or 18 on 8085) 

Addressing: immediate/register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



3-15 



Chapter 3. Instruction Set 



CPE 



CALL IF PARITY EVEN 



Parity is even if the byte in the accumulator has an even number of one bits. The parity flag is set to one to 
indicate this condition. The CPE and CPO instructions are useful for testing the parity of input data. However, 
the IN instruction does not set any of the condition flags. The flags can be set without altering the data by 
adding OOH to the contents of the accumulator. 

The CPE instruction combines functions of the JPE and PUSH instructions. CPE tests the setting of the parity 
flag. If the flag is set to one, CPE pushes the contents of the program counter onto the stack and then jumps 
to the address specified by the CPE instruction. If the flag is set to zero, program execution simply continues 
with the next sequential instruction. 



Opcode 
CPE 



Operand 
address 



Although the use of a label is more common, the address may also be specified as a number or an expression. 



1 


1 


10 11 








low addr 


high addr 



Cycles: 3 or 5 (2 or 5 on 8085) 

States: 1 1 or 1 7 (9 or 18 on 8085) 

Addressing; immediate/register indirect 

Flags: none 



Example: 

For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



CPI 



COMPARE IMMEDIATE 



CPI compares the contents of the second instruction byte with the contents of the accumulator and sets the zero 
and carry flags to indicate the result. The values being compared remain unchanged. 

The zero flag indicates equality. No carry indicates that the contents of the accumulator are greater than the 
immediate data; a carry indicates that the accumulator is less than the immediate data. However, the meaning 
of the carry flag is reversed when the values have different signs or one of the values is complemented. 



Opcode 



Operand 



CPI 



data 



3-16 



Chapter J. Instruction Set 



The operand must specify the data to be compared. This data may be in the form of a number, an ASCII 
constant, the label of a previously defined value, or an expression. The data may not exceed one byte. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either 
the HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the 
expression. When neither operator is present, the assembler assumes the LOW operator and issues an error 
message. 



1111111 







data 



Cycles: 


2 


States: 


7 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



Example: 

The instruction CPI 'C compares the contents of the accumulator to the letter C (43H). 



CPO 



CALL IF PARITY ODD 



Parity is odd if the byte in the accumulator has an odd number of one bits. The parity flag is set to zero to 
indicate this condition. The CPO and CPE instructions are useful for testing the parity of input data. However, 
the IN instruction does not set any of the condition flags. The flags can be set without altering the data by 
adding OOH to the contents of the accumulator. 

The CPO instruction combines functions of the JPOand PUSH instructions. CPO tests the setting of the parity 
flag. If the flag is set to zero, CPO pushes the contents of the program counter onto the stack and then jumps 
to the address specified by the CPO instruction. If the flag is set to one, program execution simply continues 
with the next sequential instruction. 



Opcode 
CPO 



Operand 
address 



Although the use of a label is more common, the address may also be specified as a number or an expression. 



1 


1 


10 1 








low addr 


high addr 



Cycles: 3 or 5 (2 or :5 on 8085) 

States: 11 or 17 (9 or 18 on 8085) 

Addressing: immediate/register indirect 

Flags: none 



3-17 



Chapter 3. (nstrucfion Set 



Example: 



For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



cz 



CALL IF ZERO 



The CZ instruction combines functions of the )Z and PUSH instructions. CZ tests the setting of the zero flag. 
If the flag is set to one (indicating that the contents of the accumulator are zero), CZ pushes the contents of 
the program counter onto the stack and then jumps to the address specified in the CZ instruction, if the flag 
is set to zero (indicating that the contents of the accumulator are other than zero), program execution simply 
continues with the next sequential instruction. 



Opcode 



Operand 



CZ 



address 



Although the use of a label is most common, the address may also be specified as a number or an expression. 



1 10 11 








low addr 


high addr 



Cycles: 3 or 5 (2 or 5 on 8085) 

States: M or 17 (9 or 18 on 8085) 

Addressing: immediate/register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related 
variants. 



DAA 



DECIMAL ADJUST ACCUMULATOR 



The DAA instruction adjusts the eight-bit value in the accumulator to form two four-bit binary coded decimal 
digits. 



Opcode 



Operand 



DAA 



Operands are not permitted with the DAA instruction. 



DAA is used when adding decimal numbers. It is the only instruction whose function requires use of the auxiliary 
carry flag, in multi-byte arithmetic operations, the DAA instruction typically is coded immediately after the arith- 
metic instruction so that the auxiliary carry flag is not altered unintentionally. 



3-18 



Chapter 3. Instruction Set 



DAA operates as follows: 

1. If the least significant four bits of the accumulator have a value greater than nine, or if the auxiliary 
carry flag is ON, DAA adds six to the accumulator. 

2. If the most significant four bits of the accumulator have a value greater than nine, or if the carry 
flag is ON, DAA adds six to the most significant four bits of the accumulator. 



10 1 1 



1 



Cycles: 


1 


States: 


4 


Addressing: 


register 


Flags: 


Z,S,P,CY,AC 



Example: 



Assume that the accumulator contains the value 9BH as a result of adding 08 to 93: 



CY 


AC 








1001 


0011 


0000 


1000 



1001 



1011 



9BH 



Since OBH is greater than nine, the instruction adds six to contents of the accumulator: 



CY AC 

1 
1001 1011 

0000 Olio 

1010 0001 



AlH 



Now that the most significant bits have a value greater than nine, the instruction adds six to them: 

CY AC 

1 1 

1010 0001 

Olio QQQQ 

0000 0001 

When the DAA has finished, the accumulator contains the value 01 in a BCD format; both the carry and auxiliary 
carry flags are set ON. Since the actual result of this addition is 101, the carry flag is probably significant to the 
program. The program is responsible for recovering and using this information. Notice that the carry flag setting is 
lost as soon as the program executes any subsequent instruction that alters the flag. 



3-19 



Chapter 3. Instruction Set 



DAD 



DOUBLE REGISTER ADD 



DAD adds the 16-bil value in the specified register pair to the contents of the H and L register pair. The result 
is stored in H and L. 



Opcode 



Operand 



DAD 




DAD may add only the contents of the B&C, D&E, H&L, or the SP (Slack Pointer) register pairs to the contents 
of H&L. Notice that the letter H must be used to specify that the H&L register pair is to be added to itself. 

DAD sets the carry flag ON if there is a carry out of the H and L registers. DAD affects none of the condition 
flags other than carry. 






R 


P 


10 1 


Cycles: 




3 


States: 




10 


Addressing: 




register 


Flags: 






CY 



Examples: 



The DAD instruction provides a means for saving the current contents of the stack pointer. 



LXI H.OOH 

DAD SP 
SHLD SAVSP 



CLEAR H&L TO ZEROS 
GET SP INTO H&L 
STORE SP IN MEMORY 



The instruction DAD H doubles the number in the H and L registers except when the operation causes a carrv 
out of the H register. 



DCR 



DECREMENT 



DCR subtracts one from the contents of the specified byte. DCR affects all the condition flags except the carry 
flag. Because DCR preserves the carry flag, it can be used within multi-byte arithmetic routines for decrementing 
character counts and similar purposes. 

Decrement Register 



Opcode 



Operand 



DCR 



reg 



3-20 



Chapter 3. Instruction Set 



The operand must specify one of the registers A through E, H or L. The instruction subtracts one from the 
contents of the specified register. 







D D D 



1 1 



Cycles: 


1 


States: 


5 (4 on 8085) 


Addressing: 


register 


Flags: 


Z,S,P,AC 



Decrement Memory 

Opcode Operand 

DCR M 

This instruction subtracts one from the contents of the memory location addressed by the H and L registers. 
M is a symbolic reference to the H and L registers. 



1 



1 



10 1 



Cycles: 


3 


Stales: 


10 


Addressing: 


register indirect 


Flags: 


Z,S,P,AC 



Example: 

The DCR instruction is frequently used to control multi-byte operations such as moving a number of characters 
from one area of memory to another: 



LOOP: 



MVI 


B,5H 


LXI 


H,260H 


LXI 


D,900H 


MOV 


A,M 


STAX 


D 


DCX 


D 


DCX 


M 


DCR 


B 


INZ 


LOOP 



SET CONTROL COUNTER 

LOAD H&L WITH SOURCE ADDR 

LOAD D&E WITH DESTINATION ADDR 

LOAD BYTE TO BE MOVED 

STORE BYTE 

DECREMENT DESTINATION ADDRESS 

DECREMENT SOURCE ADDRESS 

DECREMENT CONTROL COUNTER 

REPEAT LOOP UNTIL COUNTER=0 



This example also illustrates an efficient programming technique. Notice that the control counter is decremented 
to zero rather than incremented until the desired count is reached. This technique avoids the need for a compare 
instruction and therefore conserves both memory and execution time. 



3-21 



Chapter 3. Instruction Set 



DCX 



DECREMENT REGISTER PAIR 



DCX decrements the contents of the specified register pair by one. DCX affects none of the condition flags. 
Because DCX preserves all the flags, it can be used for address modification in any instruction sequence that 
relies on the passing of the flags. 



Opcode 



Operand 



DCX 




DCX may decrement only the B&C, D&E, H&L, or the SP (Slack Pointer) register pairs. Notice that the letter 
H must be used to specify the H and L pair. 



Exercise care when decrementing the stacl< pointer as this causes a loss of synchronization between the pointer 
and the actual contents of the stacl<. 



R 



1 1 



Cycles: 


1 


.States: 


5 (6 on 8085 


Addressing: 


register 


Flags: 


none 



Example: 

Assume that the H and L registers contain the address 9800H when the instruction DCX H is executed. DCX 
considers the contents of the two registers to be a single 16-bit value and therefore performs a borrow from the 
H register to produce the value 97FFH. 



Dl 



DISABLE INTERRUPTS 



The interrupt system is disabled when the processor recognizes an interrupt or immediately following execution 
of a Dl instruction. 

In applications that use interrupts, the Dl instruction is commonly used only when a code sequence must not be 
interrupted. For example, time-dependent code sequences become inaccurate when interrupted. You can disable 
the interrupt system by including a Dl instruction at the beginning of the code sequence. Because you cannot 
predict the occurrence of an interrupt, include an El instruction at the end of the lime-dependent code sequence. 



Opcode 



Operand 



Operands are not permitted with the Dl instruction. 



3-22 



Chapter 3. Instruction Set 



1 1 1 







1 1 



Cycles: 
States; 
Flags: 



4 
none 



NOTE 

The 8085 TRAP interrupt cannot be disabled. This special interrupt is 
intended for serious problems that must be serviced regardless of the 
interrupt flag such as power failure or bus error. However, no interrupt 
including TRAP can interrupt the execution of the D! or El instruction. 



El 



ENABLE INTERRUPTS 



The El instruction enables the interrupt system following execution of the next program instruction. Enabling 
the interrupt system is delayed one instruction to allow interrupt subroutines to return to the main program 
before a subsequent interrupt is acknowledged. 

In applications that use interrupts, the interrupt system is usually disabled only when the processor accepts an 
interrupt or when a code sequence must not be interrupted. You can disable the interrupt system by including 
a Dl instruction at the beginning of the code sequence. Because you cannot predict the occurrence of an 
inteirupt, include an El instruction at the end of the code sequence. 



Opcode 



Operand 



El 



Operands are not permitted with the El instruction. 



Cycles: 
States: 
Flags: 



1 1 



1 

4 
none 



NOTE 

The 8085 TRAP interrupt cannot be disabled. This special interrupt is 
intended for serious problems that must be serviced regardless of the 
interrupt flag such as power failure or bus failure. However, no interrupt 
including TRAP can interrupt the execution of the Dl or El instruction. 

Example: 

The El instruction is frequently used as part of a start-up sequence. When power is first applied, the processor 
begins operating at some indeterminate address. Application of a RESET signal forces the program counter to 



3-23 



Chapter i. Instruction Set 



zero. A common instruction sequence at this point is El, HLT. These instructions enable the interrupt system 
(RESET also disables the interrupt system) and halt the processor. A subsequent manual or automatic interrupt 
then determines the effective start-up address. 



HLT HALT 

The HLT instruction halts the processor. The program counter contains the address of the next sequential 
instruction. Otherwise, the flags and registers remain unchanged. 



1110 110 



Cycles: 


1 


States: 


7 (5 on 8085 


Flags: 


none 



Once in the halt state, the processor can be restarted only by an external event, typically an interrupt. Therefore, 
you should be certain that interrupts are enabled before the HLT instruction is executed. See the description of 
the EI (Enable Interrupt) instruction. 

If an 8080 HLT instruction is executed while interrupts are disabled, the only way to restart the processor is 
by application of a RESET signal. This forces the program counter to zero. The same is true of the 8085, except 
for the TRAP interrupt, which is recognized even when the interrupt system is disabled. 

The processor can temporarily leave the hall slate to service a direct memory access request. However, the pro- 
cessor reenters the halt state once the request has been serviced. 

A basic purpose for the HLT instruction is to allow the processor to pause while waiting for an interrupt from a 
peripheral device. However, a halt wastes processor resources and should be used only when there is no useful 
processing task available. 



IN INPUT FROM PORT 

The IN instruction reads eight bits of data from the specified port and loads it into the accumulator. 

NOTE 

This description is restricted to the exact function of the IN instruction. 
Input/output structures are described in the 8080 or 8085 Microcomputer 
Systems User's Manual. 

Opcode Operand 

IN exp 

The operand expression may be a number or any expression that yields a value in the range OOH through OFFH. 



3-24 



Chapter 3. Instruction Set 



1 


1 





1 1 





1 


1 


exp 



Cycles: 
States; 
Addressing: 
Flags: 



3 

10 

direct 
none 



INR INCREMENT 

INR adds one to the contents of the specified byte. INR affects all of the condition flags except the carry flag. 
Because INR preserves the carry flag, it can be used within multi-byte arithmetic routines for incrementing 
character counts and similar purposes. 

Increment Register 



Opcode 



Operand 



INR 



reg 



The operand must specify one of the registers A through E, H or L. The instruction adds one to the contents of 
the specified register. 



D D D 1 



Increment Memory 



Cycles: 


1 


States: 


5 (4 on 8085) 


Addressing: 


register 


Flags: 


Z,S,P,AC 



Opcode 
INR 



Operand 
M 



This instruction increments by one the contents of the memory location addressed by the H and L registers. M 
is a symbolic reference to the H and L registers. 



1 10 10 



Cycles: 


3 


States: 


10 


Addressing: 


register indirect 


Flags: 


Z,S,P,AC 



3-25 



Chapter 3. InMruttion Set 



Example: 



If register C contains 99H, the instruction INR C increments the contents of the register to 9AH. 



INX 



INCREMENT REGISTER PAIR 



INX adds one to the contents of the specified register pair. INX affects none of the condition flags. Because 
INX preserves all the condition flags, it can be used for address modification within multi-byte arithmetic 
routines. 



Opcode 



Operand 




INX 



INX may increment only the B&C, D&E, H&L, or the SP (Stack Pointer) register pairs. Notice that the letter H 
must be used to specify the H and L register pair. 



Exercise care when incrementing the stack pointer. Assume, for example, that INX SP is executed after a number 
of items have been pushed onto the stack. A subsequent POP instruction accesses the high-order byte of the most 
recent stack entry and the low-order byte of the next older entry. Similarly, a PUSH instruction adds the two 
new bytes to the stack, but overlays the low-order byte of the most recent entry. 







R 



Cycles: 
States: 
Addressing: 
Flags: 



1 



1 



1 

5 (6 on 8085) 

register 

none 



Example: 

Assume that the D and E registers contain the value OlFFH. The instruction INX D increments the value to 
0200H. By contrast, the INR E instruction ignores the carry out of the low-order byte and produces a result of 
OlOOH. (This condition can be detected by testing the Zero condition flag.) 

If the stack pointer register contains the value OFFFFH, the instruction INX SP increments the contents of SP 
to OOOOH. The INX instruction sets no flags to indicate this condition. 



JC 



JUMP IF CARRY 



The |C instruction tests the setting of the carry flag. If the flag is set to one, program execution resumes at tht; 
address specified in the JC instruction. If the flag is reset to zero, execution continues with the next sequential 
instruction. 



3-26 



Chapter 3. Instruction Set 



Opcode 



IC 



Operand 



address 



The address may be specified as a number, a label, or an expression. The assembler inverts ihe high and low 
address bytes when it assembles the instruction. 



1 


1 


110 


1 





low addr 


high addr 



Cycles: 
States: 
Addressing: 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Example: 

Examples of the variations of the jump instruction appear in the description of the JPO instruction. 



JM JUMP IF MINUS 

The JM instruction tests the setting of the sign flag. If the contents of the accumulator are negative (sign flag = 1), 
program execution resumes at the address specified in the JM instruction. If the contents of the accumulator are 
positive (sign flag = 0), execution continues with the next sequential instruction. 



Opcode 
jM 



Operand 
address 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low 
address bytes when it assembles the instructions. 



1 


1 


1110 


1 





low addr 


high addr 



Cycles: 
States: 
Addressing: 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Example: 

Examples of the variations of the jump instruction appear in the description of the JPO instruction. 



3-27 



Chapter 3. Instruction Set 



JMP JUMP 

The JMP instruction alters the execution sequence by loading the address in its second and third bytes into the 
program counter. 



Opcode 



Operand 



IMP 



address 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low 
address bytes when it assembles the address. 



1 


. 1 





1 


1 


low addr 


high addr 



Cycles: 
States: 
Addressing: 
Flags: 



10 

immediate 

none 



Example: 

Examples of the variations of the jump instruction appear in the description of the JPO instruction. 



INC JUMP IF NO CARRY 

The JNC instruction tests the setting of the carry flag, if there is no carry (carry flag = 0), program execution 
resumes at the address specified in the JNC instruction. If there is a carry (carry flag = 1), execution continue^ 
with the next sequential instruction. 



Opcode 



Operand 



JNC 



address 



3-28 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low 
address bytes when it assembles the instruction. 



110 10 10 



low addr 



high addr 



Cycles: 
States: 
Addressing: 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Chapter 3. Instruction Set 



JNZ 



Example: 

Examples of the variations of the jump instruction appear in the description of the JPO instruction. 



JUMP IF NOT ZERO 

The )NZ instruction tests the setting of the zero flag. If the contents of the accumulator are not zero (zero 
flag = 0), program execution resumes at the address specified in the )NZ instruction, if the contents of the 
accumulator are zero (zero flag = 1), execution continues with the next sequential instruction. 



Opcode 



jNZ 



Operand 



address 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low 
address bytes when it assembles the instruction. 



1 


1 





1 





low addr 


high addr 



Cycles: 
States: 
Addressing: 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Example: 

Examples of the variations of the jump instruction appear in the description of the jPO instruction. 



JP JUMP IF POSITIVE 

The JP instruction tests the setting of the sign flag. If the contents of the accumulator are positive (sign flag = 0), 
program execution resumes at the address specified in the jP instruction. If the contents of the accumulator are 
minus (sign flag = 1), execution continues with the next sequential instruction. 



Opcode 
iP 



Operand 
address 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low ordci 
address bytes when it assembles the instruction. 



3-29 



Chapter 3. Instruction Set 



11110 





low addr 


high addr 



Cycles: 
States: 
Addressing: 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Example: 

Examples of the variations of the jump instruction appear in the description of the J PO instruction. 



IPE 



lUMP IF PARITY EVIZN 



Parity is even if the byte in the accumulator has an even number of one bits. The parity flag is set to one to 
indicate this condition. 

The ) PE instruction tests the setting of the parity flag. If the parity flag is set to one, program execution resumes 
at the address specified in the jPE instruction. If the flag is reset to zero, execution continues with the next 
sequential instruction. 



Opcode 



Operand 



IPE 



address 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low 
address bytes when it assembles the instruction. 



The JPE and j PO (jump if parity odd) instructions are especially useful for testing the parity of input data. 
However, the IN instruction docs not set any of the condition flags. The flags can be set by adding OOH to the 
contents of the accumulator. 



1 1 


10 10 1 





low addr 


high addr 



Cycles: 
States: 
Addressing 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Example: 

Examples of the variations of the jump instruction appear in the description of the jPO instruction. 



3-30 



Chapter 3. Instruction Set 



JPO 



JUMP IF PARITY ODD 



Parity is odd if the byte in the accumulator has an odd number of one bits. The parity flag is set to zero to 
indicate this condition. 

The JPO instruction tests the setting of the parity flag. If the parity flag is reset to zero, program execution 
resumes at the address specified in the jPO instruction. If the flag is set to one, execution continues with the 
next sequential instruction. 



Opcode 



Operand 



IPO 



address 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low 
address bytes when it assembles the instruction. 



The JPO and JPE (jump if parity even) instructions arc especially useful for testing the parity of input data. 
However, the IN instruction docs not set any of the condition flags. Tlie flags can be set by adding OOH to the 
contents of the accumulator. 



1 


1 


1 








low addr 


high addr 



Cycles: 
States; 
Addressing: 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Example: 

This example shows three different but equivalent methods (or jumping to one of two points in a program Iwscd 
upon whether or not the Sign bit of a number is set. Assume that the byte to be tested is the C register. 



Label 


Code 


Operand 


ONE: 


MOV 


A,C 




ANI 


80H 




JZ 


PLUS 




)NZ 


MINUS 


TWO: 


MOV 
RLC 


A,C 




JNC 


PLUS 




JMP 


MINUS 


THREE: 


MOV 


A,C 




ADI 







jM 


MINUS 


PLUS: 


- 


;SIGN BIT RESET 


MINUS: 


— 


;SIGN BIT SET 



3-31 



Chapter 3. Instruction Set 



The AND immedialc inslruclion in block ONE zeroes all bits of ihe data byte except the Sign bit, which re- 
mains unchanged. If the Sign bit was zero, the Zero condition bit will be set, and the JZ instruction will cause 
program control to be transferred to the instruction at PLUS. Otherwise, the )Z instruction will merely update 
the program counter by three, and the JNZ instruction will be executed, causing control to be transferred to 
the instruction at MINUS. (The Zero bit is unaffected by all jump instructions.) 

The RLC instruction in block TWO causes the Carry bit to be set equal to the Sign bit of the data byte. If the 
Sign bit was reset, the JNC instruction causes a jump to PLUS. Otherwise the JMP instruction is executed, 
unconditionally transferring control to MINUS. (Note that, in this instance, a JC instruction could be sub- 
stituted for the unconditional jumip with identical results.) 

The add immediate instruction in block THREE causes the condition bits to be set. If the sign bit was set, the 
JM instruction causes program control to be transferred to MINUS. Otherwise, program control flows auto- 
matically into the PLUS routine. 



JUMP IF ZERO 

The JZ instruction tests the setting of the zero flag. If the flag is set to one, program execution resumes at the 
address specified in the JZ instruction. If the flag is reset to zero, execution continues with the next sequential 
instruction. 



Opcode 



Operand 



address 



The address may be specified as a number, a label, or an expression. The assembler inverts the high and low 
address bytes when it assembles the instruction. 



1 


10 10 





low addr 


high addr 



Cycles: 
States: 
Addressing: 
Flags: 



3 (2 or 3 on 8085) 
10 (7 or 10 on 8085) 
immediate 
none 



Example: 

Examples of the variations of the jump instruction appear in the description of the JPO instruction. 



LDA 



LOAD ACCUMULATOR DIRECT 



LDA loads the accumulator with a copy of the byte at the location specified in bytes two and three of the 
LDA instruction. 



3-32 



Chapter 3. Instruction Set 



Opcode 



Operand 



LDA 



address 



The address may be stated as a number, a previously defined label, or an expression. The assembler inverts the 
high and low address bytes when it builds the instruction. 









1 


1 1 


1 





low addr 


high addr 



Cycles: 4 

States: 13 

Addressing: direct 

Flags: none 



Examples: 



The following instructions are equivalent. When executed, each replaces the accumulator contents with the byte 
of data stored at memory location 300H. 

LOAD: LDA 300H 

LDA 3*(16*16) 
LDA 200H+256 



LDAX 



LOAD ACCUMULATOR INDIRECT 



L DAX loads the accumulator with a copy of the byte stored at the memory location addressed by register pair 
B or register pair D. 



Opcode 
LDAX 



Operand 



B 
D 



) 



The operand B specifies the B and C register pair; D specifies the D and E register pair. This instruction may 
specify only the B or D register pair. 






r 


10 10 



jo = register pair B 
]l ~ register pair D 



Cycles: 
States: 
Addressing: 
Flags: 



2 

7 

register indirect 

none 



3-33 



cmpier 3. Instruction Set 



Example: 



Assume that register D contains 93H and register E contains 8BH. The following instruction ioads the accumulator 
with the contents of memory location 938BH; 

LDAX D 



LHLD 



LOAD H AND L DIRECT 



LHLD loads the L register with a copy of the byte stored at the memory location specified in bytes two and 
three of the LHLD instruction, LHLD then loads the H register with a copy of the byte stored at the next 
higher memory location. 



Opcode 



Operand 



LHLD 



address 



The address may be stated as a number, a label, or an expression. 



Certain instructions use the symbolic reference M to access the memory location currently specified by the H and 
L registers. LHLD is one of the instructions provided for loading new addresses into the H and L registers. The 
user may also load the current top of the stack into the H and L registers (POP instruction). Both LHLD and 
POP replace the contents of the H and L registers. You can also exchange the contents of H and L with the D 
and E registers (XCHG instruction) or the top of the stack (XTHL instruction) if you need to save the current 
H and L registers for subsequent use. SHLD stores H and L in memory. 









1 


1 


1 





low addr 


high addr 



Cycles: 
States: 
Addressing: 
Flags: 



5 

16 

direct 
none 



Example: 

Assume that locations 3000 and 3001 H contain the address 064EH stored in the format 4E06. In the following 
sequence, the iMOV instruction moves a copy of the byte stored at address 064E into the accjmulator: 



LHLD 3000H 

MOV A,M 



;SET UP ADDRES,S 

;LOAD a\CCUM FROM ADDRESS 



3-34 



Chapter 3. Instruction Set 



LXI 



LOAD REGISTER PAIR IMMEDIATE 



LXI is a three-byte instruction; its second and third bytes contain the source data to be loaded into a register 
pair. LXI loads a register pair by copying its second and third bytes into the specified destination register pair. 



Opcode 



LXI 



Operand 
\ 



B 
D 
H 
SP 



S u ? '^^'^^ 



The first operand must specify the register pair to be loaded. LXI can load the B and C register pair, the D and 
E register pair, the H and L register pair, or the Stack Pointer. 

The second operand specifies the two bytes of data to be loaded. This data may be coded in the form of a num- 
ber, an ASCII constant, the label of some previously defined value, or an expression. The data must not exceed 
two bytes. 

LXI is the only inmediate instruction that accepts a 16-bit value. All other immediate instructions require 8-bit 
values. 

Notice that the assembler inverts the two bytes of data to create the format of an address stored in memory. 
LXI loads its third byte into the first register of the pair and its second byte into the second register of the 
pair. This has the effect of reinverting the data into the format required for an address stored in registers. Thus, 
the instruction LXI B,'AZ' loads A into register B and Z into register C. 









R P 








1 


low-order data 


high-order data 



Cycles: 


3 


States: 


10 


Addressing: 


immediate 


Flags: 


none 



Examples: 

A common use for LXI is to establish a memory address for use in subsequent instructions. In the following 
sequence, the LXI instruction loads the address of STRNG into the H and L registers. The MOV instruction then 
loads the data stored at that address into the accumulator. 

LXI H,STRNG ;SET ADDRESS 

MOV A,M ;LOAD STRNG INTO ACCUMULATOR 

The following LXI instruction is used to initialize the stack pointer in a relocatable module. The LOCATE pro- 
gram provides an address for the special reserved label STACK. 



LXI SP,STACK 



3-35 



Chapter 3, Instruction Set 



MOV 



MOVE 



The MOV instruction moves one byte of data by copying the source field into the destination field. Source data 
remains unchanged. The instruction's operands specify whether the move is from register to register, from a 
register to memory, or from memory to a register. 

Mo we Register to Register 



Opcode 



Operand 



MOV 



regl ,reg2 



The instruction copies the contents of reg2 into regl . Each operand must specify one of the registers A, B, C, D, 
E, H, or L. 

When the same register is specified for both operands (as in MOV A, A), the MOV functions as a NOP (no opera- 
tion) since it has no other noticeable effect. This form of MOV requires one more machine state than NOP, and 
therefore has a slightly longer execution time than NOP. Since M addresses a register pair rather than a byte of 
data, MOV M,M is not allowed. 



1 


D 


D 


D 


s s s 


Cycles: 




1 


States: 




5 (4 on 8085) 


Addressing: 




register 


Flags: 






none 



IVIowe to Memory 



Opcode 



Operand 



MOV 



M,r 



This instruction copies' the contents of the specified register into the memory location addressed by the H and L 
registers. M is a symbolic reference to the H and L register pair. The second operand must address one of the 
registers. 



1110 


s s s 



Cycles: 
States: 
Addressing 
Flags: 



2 

7 

register indirect 

none 



Move from Memory 



Opcode 
MOV 



Operand 
r,M 



3-36 



Chapter 3. Instruction Set 



This instruction copies the contents of the memory location addressed by the H and L registers into the specified 
register. The first operand must name the destination register. The second operand must be M. M is a symbolic 
reference to the H and L registers. 



1 


D 


D 


D 


1 1 


Cycles: 




2 


States: 




7 


Addressing: 




register indirec 


Flags: 






none 



Examples: 



Label 



Opcode 



Operands 



Comment 



LDACC: 
NULOP: 



MOV 
MOV 
MOV 



A,M 
E,A 
C,C 



LOAD ACCUM FROM MEMORY 
COPY ACCUM INTO E REG 
NULL OPERATION 



MVI 



MOVE IMMEDIATE 



MVI is a two-byte instruction; its second byte contains the source data to be moved. MVI moves one byte of 
data by copying its second byte into the destination field. The instruction's operands specify whether the move 
is to a register or to memory. 

Move Immediate to Register 



Opcode 



Operand 



MVI 



reg,data 



The first operand must name one of the registers A through h, H or L as a destination for the move. 

The second operand specifies the actual data to be moved. This data may be in the form of a number, an ASCII 
constant, the label of some previously defined value, or an expression. The data must not exceed one byte. 



The assembler's relocation feature treats all external and relocatable symbols as ^6-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 
HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOW operator and issues an error message. 






D 


D 


D 


1 1 





data 


Cycles: 




2 




States: 




7 




Addressing: 




immediate 




Flags: 






no 


ne 





3-37 



Cliapter 3. Instruction Set 



Move Immediate to Memory 




Opcode 


Operand 


MVI 


M,data 



This instruction copies tlie data stored in its second byte into the memory location addressed by H and L. M is 
a symbolic reference to the H and L register pair. 



1 10 110 



data 



Cycles: 


3 


States: 


10 


Addressing: 


immediate/register indirect 


Flags: 


none 



Examples: 

The following examples show a number of methods for defining immediate data in the MVI instruction. All of 
the examples generate the bit pattern for the ASCII character A. 



MVI 


M,01 000001 B 


MVI 


M.'A' 


MVI 


M,41H 


MVI 


M,101Q 


MVI 


M,65 


MVI 


M,5+30*2 



NOP 



NO OPERATION 

NOP performs no operation and affects none of the condition flags. NOP is useful as filler in a timing loop. 

Opcode Operand 

NOP 
Operands are not permitted with the NOP instruction. 



ORA INCLUSIVE OR WITH ACCUMULATOR 

ORA performs an inclusive OR logical operation using the contents of the specified byte and the accumulator. The 
result is placed in the accumulator. 



3-38 



Chapter 3. Instruction Set 



Summary of Logical Operations 

AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are 
one. 

OR produces a one bit in the result when the corresponding bits in either the test data or the mask data are 
ones. 

Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are 
different; i.e., a one bit in either the test data or the mask data - but not both — produces a one bit in the 
result. 



AND 



OR 



EXCLUSIVE OR 



1010 1010 
0000 1111 
0000 1010 



1010 1010 
0000 1111 
1010 1111 



1010 1010 
0000 1111 
1010 0101 



OR Register with Accumulator 



Opcode 
ORA 



Operand 
reg 



The operand must specify one of the registers A through E, H or L. This instruction ORs the contents of the 
specified register and the accumulator and stores the result in the accumulator. The carry and auxiliary carry 
flags are reset to zero. 





1 


1 


1 


S S S 




Cycles: 




1 


States: 




4 


Address 


ng: 


register 


Flags: 




2,S,P,CY,AC 


OR Memory with Accumulator 






Opa 


ode 




Operai 


id 



ORA 



M 



The contents of the memory location specified by the H and L registers are inclusive-ORed with the contents of 
the accumulator. The result is stored in the accumulator. The carry and auxiliary carry flags are reset to zero. 



1 1 











Cycles: 


2 


States: 


7 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



3-39 



Chapter 3. fnstruction Set 



Example: 



Since any bit inclusive-ORed with a one produces a one and any bit ORed with a zero remains unchanged, ORA 
is frequently used to set ON particular bits or groups of bits. The following example ensures that bit 3 of the 
accumulator is set ON, but the remaining bits are not disturbed. This is frequently done when individual bits 
are used as status flags in a program. Assume that register D contains the value 08H; 



Accumulator 
Register D 



= 01000011 

= 1 OOP 

10 10 11 



ORi 



INCLUSIVE OR IMMEDIATE 



ORI performs an inclusive OR logical operation using the contents of the second byte of the instruction and the 
contents of the accumulator. The result is placed in the accumulator. ORI also resets the carry and auxiliary 
carry flags to zero. 



Opcode 
ORI 



Operand 
data 



The operand must specify the data to be used in the inclusive OR operation. This data may be in the form of a 
number, an ASCII constant, the label of some previously defined value, or an expression. The data may not 
exceed one byte. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 
HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assume the LOW operator and issues an error message. 



1 1 



1 



1 



1 1 







data 



Cycles: 


2 


States: 


7 


Addressing: 


immediate 


Flags: 


Z,S,P,SY,AC 



Summary of Logical Operations 

AND produces a one bit in the result only when the corresponding bits in both the test data and the mask data 
are ones. 

OR produces a one bit in the result when the corresponding bits in either the test data or the mask data are ones. 

Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data arc 
different; i.e., a one bit in either the test data or the mask data - but not both produces a one bit in the 
result. 



3-40 



Chapter 3. Instruction Set 



AND 



OR 



EXCLUSIVE OR 



1010 1010 
0000 1111 
0000 1010 



1010 1010 
0000 1 1 1 1 

1010 nil 



1010 1010 
0000 1 1 1 1 
1010 0101 



Example: 

See the description of the ORA instruction for an example of the use of the inclusive OR. The following 
examples show a number of methods for defining immediate data in the OR! instruction. All of the examples 
generate the bit pattern for the ASCII character A. 



OR! 


01 000001 B 


OR! 


'A' 


ORl 


41 H 


OR! 


1010 


ORl 


65 


ORl 


5+30*2 



OUT 



OUTPUT TO PORT 



The OUT instruction places the contents of the accumulator on the eight-bit data bus and the number of the 
selected port on the sixteen-bit address bus. Since the number of ports ranges from through 255, the port 
number is duplicated on the address bus. 

It is the responsibility of external logic to decode the port number and to accept the output data. 



NOTE 

Because a discussion of input/output structures is beyond the scope of 
this manual, this description is restricted to the exact function of the 
OUT instruction. Input/output structures are described in the 8080 or 
8085 Microcomputer Sy sterns User's Manual. 



Opcode 



Operand 



OUT 



exp 



The operand must specify the number of the desired output port. This may be in the form of a number or an 
expression in the range OOH through OFFH. 



1 


1 





1 





1 


1 


exp 



Cycles: 


3 


States: 


10 


Addressing: 


direct 


Flags: 


none 



3-41 



Chapter 3. Instruction Set 



PCHL 



MOVE H&L TO PROGRAM COUNTER 



PCHL loads the contents of the H and L registers into the program counter register. Because the processor 
fetches the next instruction from the updated program counter address, PCHL has the effect of a jump instruc- 
tion. 



Opcode 



Operand 



PCHL 



Operands are not permitted with the PCHL instruction. 



PCHL moves the contents of the H register to the high-order eight bits of the program counter and the contents 
of the L register to the low-order eight bits of the program counter. 



The user program must ensure tl.at the H and L registers contain the address of an executable instruction when 
the PCHL instruction is executed. 



1 1 



10 1 



Cycles: 


1 


Stales: 


5 (6 on 8085 


Addressing: 


register 


Flags: 


none 



Example: 

One technique for passing data to a subroutine is to place the data immediately after the subroutine call. The 
return address pushed onto the stack by the CALL instruction actually addresses the data rather than the next 
instruction after the CALL. For this example, assume that two bytes of data follow the subroutine call. The 
following coding sequence performs a return to the next instruction after the call: 



GOBACK: 



POP H 

INR L 

INR L 
PCHL 



GET DATA ADDRESS 
ADD 2 TO FORM 
RETURN ADDRESS 
RETURN 



POP POP 

The POP instruction removes two bytes of data from the stack and copies them to a register pair or copies the 
Program Status Word into the accumulator and the condition flags. 

POP Register Pair 

POP copies the contents of the memory location addressed by the stack pointer into the low-order regis :er of the 
register pair. POP then increments the stack pointer by one and copies the contents of the resulting address into 



3-42 



Chapter 3. Instruction Set 



the high-order register of the pair. POP then increments the stack pointer again so that it addresses the next 
older item on the stack. 



Opcode 



Operand 



POP 



D 

H 
, PSW, 



The operand may specify the B&C, D&E, or the H&L register pairs. POP PSW is explained separately. 



1 1 


R 


P 


1 


Cycles: 




3 


States: 




10 


Addressing: 




register indirect 


Flags: 






none 



POP PSW 



POP PSW uses the contents of the memory location specified by the stack pointer to restore the condition flags. 
POP PSW increments the stack pointer by one and restores the contents of that address to the accumulator. 
POP then increments the stack pointer again so thai it addresses the next older item on the stack. 



11110 1 



Cycles: 


3 


States: 


10 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



Example: 

Assume that a subroutine is called because of an external interrupt. In general, such subroutines should save and 
restore any registers it uses so that main program can continue normally when it regains control. The following 
sequence of PUSH and POP instructions save and restore the Program Status Word and all the registers: 



3-43 



Chapter 3. Instruction Set 



PUSH 


PSW 


PUSH 


B 


PUSH 


D 


PUSH 


H 



subroutine coding 



POP 


H 


POP 


D 


POP 


B 


POP 


PSW 


RET 





Notice that the sequence of the POP instructions is the opposite of the PUSH instruction sequence. 



PUSH 



PUSH 



The PUSH instruction copies two bytes of data to the stack. This data may be the contents of a register pair or 
the Program Status Word, as explained below: 

PUSH Register Pair 

PUSH decrements the stack pointer register by one and copies the contents of the high-order register of the 
register pair to the resulting address. PUSH then decrements the pc)inter again and copies the low-order register 
to the resulting address. The source registers remain unchanged. 



Opcode 



Operand 



PUSH 



< 



I 
D 

H 

PSW 



> 



The operand may specify the B&C, D&E, or H&L register pairs. PUSH PSW is explained separately. 



1 1 


R 


P 


10 1 




Cycles: 
Stales: 
Address 
Flags: 


ing: 




3 

11 (13 on 808 

register indirec 

none 


5 
t 



Example: 

Assume that register B contains 2AH, the C register contains 4CH, and the stack pointer is set at 9AAF. The 
instruction PUSH B stores the B register at memory address 9AAEH and the C register at 9AADH. The stack 
pointer is set to 9AADH: 



3-44 



Chapter 3. Instruction Set 



Stack 
Before PUSH 



Address 



Stack 
After PUSH 



SP before • 



XX 
XX 
XX 
XX 



9AAF 
9AAE 
9AAD 
9AAC 



XX 

2A 
4C 

XX 



SP after 



PUSH PSW 

PUSH PSW copies the Program Status Word onto the stack. The Program Status Word comprises the contents 
of the accumulator and the current settings of the condition flags. Because there are only five condition flags, 
PUSH PSW formats the flags into an eight-bit byte as follows: 



1 







s 


z 





AC 





P 


1 


CY 



On the 8080, bits 3 and 5 are always zero; bit one is always set to one. These filler bits are undefined on the 
8085. 

PUSH PSW decrements the stack pointer by one and copies the contents of the accumulator to the resulting 
address. PUSH PSW again decrements the pointer and copies the formatted condition flag byte to the resulting 
address. The contents of the accumulator and the condition flags remain unchanged. 



11110 10 1 



Cycles: 


3 


States: 


11 (12 on 8085) 


Addressing: 


register indirect 


Flags: 


none 



Example: 

When a program calls subroutines, it is frequently necessary to preserve the current program status so the calling 
program can continue normally when it regains control. Typically, the subroutine performs a PUSH PSW prior to 
execution of any instruction that might alter the contents of the accumulator or the condition flag settings. 
The subroutine then restores the pre-call system status by executing a POP PSW instruction just before returning 
control to the calling program. 



RAL ROTATE LEFT THROUGH CARRY 

RAL rotates the contents of the accumulator and the carry flag one bit position to the left. The carry flag, which 
is treated as though it were part of the accumulator, transfers to the low-order bit of the accumulator. The high- 
order bit of the accumulator transfers into the carry flag. 



Opcode 



Operand 



RAL 



Operands are not permitted with the RAL instruction. 



345 



Chapter 3. Instruction Set 



10 1 1 1 



Cycles; 


1 


States: 


4 


Flags: 


CY only 



Example: 

Assume that the accumulator contains the \'alue OAAH and the carry flag is zero. The following diagrams illus- 
trate the effect of the RAL instruction: 



Before: 



Carry 




Accumulator 



10 10 10 10 



After: 



Carry 



m 



Accumulator 



10 10 10 



RAR 



ROTATE RIGHT THROUGH CARRY 



RAR rotates the contents of the accumulator and the carry flag one bit positiejn to the right. The carry flag, 
which is treated as though it were part of the accumulator, transfers to the high-order bit of the accumulator. 
The low-order bit of the accumulator transfers into the carry flag. 



Opcode 



Operand 



RAR 



Operands are not permitted with the RAR instruction. 



11 



Cycles: 
States: 
Flags: 



4 

CY only 



346 



Chapter 3. Instruction Set 



Example: 

Assume thai the accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus- 
trate the effect of the RAR instruction: 



Before: 



Carry 













um 


















Ace 


ulator 










^ 


1 





1 1 





1 








After; 



Carry 



Accumulator 



1 1 1 1 



RC 



RETURN IF CARRY 



The RC instruction tests the carry flag. If the flag is set to one to indicate a carry, the instruction pops two 
bytes off the stack and places them in the program counter. Program execution resumes at the new address in 
the program counter. If the flag is zero, program execution simply continues with the next sequential instruction. 



Opcode 



Operand 



RC 



Operands are not permitted with the RC instruction. 



10 110 



Cycles: 1 or 3 

States: 5 or 11 (6 or 12 on 8085) 

Addressing: register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the RET instruction but not for each of its closely related 
variants. 



347 



Chapter 3. Instruction Set 



RET 



RETURN FROM SUBROUTINE 



The RET instruction pops two bytes of data off the stack and places them in the program counter register. 
Program execution resumes at the new address in the program counter. 

Typically, RET instructions are used in conjunction with CALL instructions. (The same is true of the variants 
of these instructions.) In this case, it is assumed that the data the RET instruction pops off the stack is a 
return address placed there by a previous CALL. This has the effect of returning control to the next instruction 
after the CALL. The user must be certain that the RET instruction finds the address of executable code on the 
stack. If the instruction finds the address of data, the processor attempts to execute the data as though it were 
code. 



Opcode 



Operand 



RET 



Operands are not permitted with the RET instruction. 



1 1 





10 1 


Cycles; 




3 


States: 




10 


Addressing: 




register indirect 


Flags: 




none 



Example: 

As mentioned previously, subroutines can be nested. That is, a subroutine can call a subroutine that calls 
another subroutine. The only practical limit on the number of nested calls is the amount of memory available 
for stacking return addresses. A nested subroutine can even call the subroutine that called it, as shown in the 
following example. (Notice that the program must contain logic that eventually returns control to the main 
program. Otherwise, the two subroutines will call each other indefinitely.) 



MAIN PROGRAM 



CALL SUBA- 



SUBA: 



SUBB: 



CNZ SUBi3' 



RET 



-CALL SUBA 



RET 



RIM (8085 PROCESSOR ONLY) 



READ INTERRUPT MASK 



The RIM instruction loads eight bits of data into the accumiulator. The resulting bit pattern indicates the current 
setting of the interrupt maslc, the setting of the interrupt flag, pending interrupts, and one bit of serial input data, 
if any. 



348 



Chapter 3. Instruction Set 



Opcode 



Operand 



RIM 



Operands arc not permitted with the RIM instruction. 

The RIM instruction loads the accumuSator with the following information; 



7 


6 


5 


4 


3 


2 


1 





SID 


17 


16 


15 


IE 


7.5 


6.5 


5.5 



-/ \- 



~\/~ 



v^ 



-\y^ 



interrupt Masks: 



masked 



■Interrupt Enable Flag: 1 = enabled 



-Pending Interrupts: I = pending 



-Serial Input Data Bit, if any 



The mask and pending flags refer only to the RST5.5, RST6.5, and RST7.5 hardware interrupts. The IE flag 
refers to the cnlirc interrupt system. Thus, the IE flag is identical in function and level to the INTE pin on the 
8080. A I bit in this flag indicates that the entire interrupt system is enabled. 



10 



Cycles: 
States: 
Flags: 



1 

4 
none 



RLC 



ROTATE ACCUMULATOR LEFT 



RLC sets the carry flag equal to the high-order bit of the accumulator, thus overwriting its previous setting. RLC 
then rotates the contents of the accumulator one bit position to the left with the high-order bit transferring to 
the low-order position of the accumulator. 



Opcode 



Operand 



RLC 



Operands are not allowed with the RLC instruction. 



1 1 1 



Cycles: 
States: 
Flags: 



1 

4 
CY only 



349 



Chapter 3. Instruction Set 



Example: 



Assume that the accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus- 
trate the effect of the RLC mstruction. 



Before: 



After: 



Carry 














Accumu 


lator 




10 10 10 10 


-* — 1 







Carry 



Accumulator 



RM 



RETURN IF MINUS 



The RM instruction tests the sign flag. If the flag is set to one to indicate negative data in the accumulator, the 
instruction pops two bytes off the stack and places them in the program counter. Program execution resumes at 
the new address in the prog: am counter. If the flag is set to zero, program execution simply continues with the 
next sequential instruction. 



Opcode 



Operand 



RM 



Operands are not permitted with the RM instruction. 



1 



10 



Cycles: 1 or 3 

States: 5 or 11 (6 or 12 on 8085) 

Addressing: register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the RET instruction but not for each of its closely related 
variants. 



3-50 



Chapter 3. Instruction Set 



RNC 



RETURN IF NO CARRY 



The RNC instruction tests the carry flag. If the flag is set to zero to indicate that there has been no carry, the 
instruction pops two bytes off the rtack and places them in the program counter. Program execution resumes at 
the new address in the program counter. If the flag is one, program execution simply continues with the next 
sequential instruction. 



Opcode 



Operand 



RNC 



Operands arc not permitted with the RNC instruction. 



110 10 



Cycles: 1 or 3 

States: 5 or 11 (6 or 12 on 8085) 

Addressing: register indirect 

Flags: none 

Example: 

For the sake of brevity, an example is given for the RET instruction but not for each of its closely related 
variants. 



RNZ 



RETURN IF NOT ZERO 



The RNZ instruction tests the zero flag. If the flag is set to zero to indicate that the contents of the accumulator 
arc other than zero, the instruction pops two bytes off the stack and places them in the program counter. Pro- 
gram execution resumes at the new address in the program counter. If the flag is set to one, program execution 
simply continues with the next sequential instruction. 



Opcode 
RNZ 



Operand 



Operands arc not permitted with the RNZ instruction. 



110 



Cycles: 
States: 
Addressing: 
Flags: 



1 or 3 

5 or 11 (6 or 12 on 8085) 

register indirect 

none 



Example: 

For the sake of brevity, an example is given for the RET instruction but not for each of its closely related 
variants. 



3-51 



chapter 3. Instruction Set 



RP 



RETURN IF POSITIVE 



The RP instruction tests the sign flag. If the flag is reset to zero to indicate positive data in the accumulator, 
the instruction pops two bytes off the stack and places them in the program counter. Program execution 
resumes at the new address in the program counter. If the flag is set to one, program execution simply continues 
with the next sequential instruction. 



Opcode 



Operand 



RP 



Operands are not permitted with the RP instruction. 



11110 



Cycles: 
States; 
Addressing: 
Flags: 



1 or 3 

5 or 1 1 (6 or 12 on 
register indirect 
none 



Example: 

For the sake of brevity, an example is given for the RET instruction but not lor each of its closely related 
variants. 



RPE 



RETURN IF PARITY EVEN 



Parity is even if the byte in the accumulator has an even number of one bits. The parity flag is set to one to 
indicate this condition. The RPE and RPO instructions are useful for testing the parity of input data. However, 
the IN instruction does not set any of the condition flags. The flags can be set without altering the data by 
adding OOH to the contents of the accumulator. 

The RPE instruction tests the parity flag. If the flag is set i.o one to indicate even parity, the instruction pops 
two bytes off the stack and places them in the program counter. Program execution resumes at the new address 
in the program counter. If the flag is zero, program execution simply continues with the next sequential instruc- 
tion. 

Opcode Operand 

RPE 



Operands are not permitted with the RPE instruction. 



1110 10 



Cycles: 
States: 
Addressing: 
Flags: 



1 or 3 

5 or 11 (6 or 12 on 8085) 

register indirect 

none 



3-52 



Chapter 3. Instruction Set 



Example: 

For the sake of brevity, an example is given for the RET instruction but not for each of its closely related 
variants. 



RPO 



RETURN IF PARITY ODD 



Parity is odd if the byte in the accumulator has an odd number of one bits. The parity flag is reset to zero to 
indicate this condition. The RPO and RPE instructions are useful for testing the parity of input data. However, 
the IN instruction does not set any of the condition flags. The flags can be set without altering the data by 
adding OOH to the contents of the accumulator. 

The RPO instruction tests the parity flag. If the flag is reset to zero to indicate odd parity, the instruction pops 
two bytes off the stack and places them in the program counter. Program execution resumes at the new address 
in the program counter. If the flag is set to one, program execution simply continues with the next sequential 
instruction. 



Opcode 
RPO 



Operand 



Operands are not permitted with the RPO instruction. 



110 



Cycles: 
States: 
.Addressing 
Flags: 



1 or 3 

5 or 11 (6 or 12 on 8085) 

register indirect 

none 



Example: 

For the sake of brevity, an examiple is given for the RET instruction but not for each of its closely related 
variants. 



RRC 



ROTATE ACCUMULATOR RIGHT 



RRC sets the carry flag equal to the low-order bit of the accumulator, thus overwriting its previous setting. RRC 
then rotates the contents of the accumulator one bit position to the right with the low-order bit transferring to 
the high order position of the accumulator. 



Opcode 
RRC 



Operand 



Operands are not permitted with the RRC instruction. 



3-53 



Chapter 3. Instruction Set 



1111 



Cycles: 
States: 
Flags: 



1 

4 
CY only 



RST 



Example: 

Assume that the accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus- 
trate the effect of the RRC instruction: 



Before: 



Carry 






























Accumu 


lator 






1 





1 1 


1 C 


\ 



















After: 



A Carry ^ 



Accumulator 



10 1:0101 



r 



y 



RESTART 



RST is a special purpose CALL instruction designed primarily for use with interrupts. RST pushes the contents 
of the program counter onto the stack to provide a return address and then jumps to one of eight predetermined 
addresses. A three -bit code carried in the opcode of the RST instruction specifies the jump address. 

The restart instruction is unique because it seldom appears as source code in an applications program. More often, 
the peripheral devices seeking interrupt service pass this one-byte instruction to the processor. 

When a device requests interrupt service and interrupts are enabled, the processor acknowledges the request and 
prepares its data lines to accept any one-byte instruction from the device. RST is generally the instruction of 
choice because its special purpose CALL establishes a return to the main program. 

The processor moves the three-bit address code from the RST instruction into bits 3, 4, and 5 of the program 
counter. In effect, this multiplies the code by eight. Program execution resumes at the new address where eight 
bytes are available for code to service the interrupt. If eight bytes are too few, the program can either jump to 
or call a subroutine. 



3-54 



Chapter 3. Instruction Set 



8085 NOTE 

The 8085 processor includes four hardware inputs that generate internal RST 
instructions. Rather than send a RST instruction, the interrupting device need 
only apply a signal to the RST5.5, RST6.5, RST7.5, or TRAP input pin. 
The processor then generates an internal RST instruction. The execution 
depends on the input; 



INPUT 
NAME 



RESTART 
ADDRESS 



TRAP 

RST5.5 
RST6.5 
RST7.5 



24H 
2CH 
34H 
3CH 



Notice that these addresses are within the same portion of memory used by the RST instruction, and therefore 
allow only four bytes - enough for a call or jump and a return for the interrupt service routine. 

if included in the program code, the RST instruction has the following format: 



Opcode 



Operand 



RST 



code 



The address code must be a number or expression within the range OOOB through 1 1 I B. 



Program 
Counter 



1 1 


c c c 


1 1 1 



14 13 



After RST 















c c 



Cycles: 
States: 
Addressing: 
Flags: 



II (12 on 8085) 
register indirect 
none 



RZ 



RETURN IF ZERO 



The RZ instruction tests the zero flag. If the flag is set to one to indicate that the contents of the accumulator are 
zero, the instruction pops two bytes of data off the stack and places them in the program counter. Program 
execution resumes at the new address in the program counter. If the flag is zero, program execution simply 
continues with the next sequential instruction. 



3-55 



Chapter 3. Instruction Set 



Opcode 



Operand 



RZ 



Operands are not permitted with the RZ instruction. 



1 1 





10 




Cycles: 




1 or 3 




States: 




5 or 11 (6 or 12 on 8085) 


Addressing: 




register indirect 


Flags: 




none 





Example: 

For the sake of brevity, an example is given for the RET instruction but oot for each of its closely related 
variants. 



SBB 



SUBTRACT WITH BORROW 



SBB subtracts one byte of data and the setting of the carry flag from the contents of the accumulator. The 
result is stored in the accumulator. SBB then updates the setting of the carry flag to indicate the outcome of 
the operation. 

SBB's use of the carry flag enables the program to subtract aulti-byte strings. SBB incorporates the carry flag by 
adding it to the byte to be subtracted from the accumulator. It then subtracts the result from the accumulator 
by using two's complement addition. These preliminary operations occur in the processor's internal work registei 
so that the source data remains unchanged. 

Subtract Register from Accumulator with Borrow 



Opcode 
SBB 



Operand 
reg 



The operand must specify one of the registers A through E, H or L. This instruction subtracts the contents of 
the specified register and the carry flag from the accumulator and stores the result in the accumulator. 



10 1 


1 


S S s 


Cycles: 


1 


States: 


4 


Addressing: 


register 


Flags: 


I 


^,S,P,CY,AC 



3-56 



Chapter 3. Instruction Set 



Subtract Memory from Accumulator with Borrow 

Opcode Operand 

SBB M 



This instruction subtracts the carry flag and the contents of the memory location addressed by the H and L 
registers from the accumulator and stores the result in the accumulator. 



10 1111 







Cycles: 


2 


States: 


7 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



Example: 

Assume that register B contains 2, the accumulator contains 4, and the carry flag is set to 1. The instruction 
SBB B operates as follows: 



2H + carry = 3H 

2's complement of 3H = 1111 



101 



Accumulator = 00000100 
111! I 101 
00000001 



IH 



Notice that this two's complement addition produces a carry. When SBB complements the carry bit generated 
by the addition, the carry flag is reset OFF. The flag settings resulting from the SBB B instruction are as 
follows: 



Carry 




= 





Sign 




= 





Zero 




= 





Parity 




= 





Aux. C 


irry 


= 


1 



SBI 



SUBTRACT IMMEDIATE WITH BORROW 



SBI subtracts the contents of the second instruction byte and the setting of the carry flag from the contents of 
the accumulator. The result i-, stored in the accumulator. 

SBi's use of the carry flag enables the program to subtract multi-byte strings. SBI incorporates the carry flag by 
adding it to the byte to be subtracted from the accumulator. It then subtracts the result from the accumulator 
by using two's complement addition. These preliminary operations occur in the processor's internal work registers 
so that the immediate source data remains unchanged. 



3-57 



Chapter 3. Instruction Set 



The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 
HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOW operator and issues an error message. 



Opcode 
SBI 



Operand 
data 



The operand must specify the data to be subtracted. This data may be in the form of a number, an ASCII 
constant, the label of some perviously defined value, or an expression. The data may not exceed one byte. 



1 



1 1 



1 



1 



Cycles: 


2 


States: 


7 


Addressing: 


immediate 


Flags: 


Z,S,P,CY,AC 



Example: 

The following sequence of instructions enables the program to test the setting of the carry flag 



XRA 
SB! 



A 
1 



The exclusive OR with the accumulator clears the accumulator to zeros but does not affect the setting of the 
carry flag. (The XRA instruction is explained later in this chapter.) When the carry flag is OFF, SBI i yields 
a minus one. When the flag is set ON, SBI 1 yields a minus '.wo. 



NOTE 

Tills example is included for illustrative purposes. In most 
cases, the carry flag can be tested more efficiently by using 
ths jNC instruction (jump if no carry). 



SHLD 



STORE H AND L DIRECT 



SHLD stores a copy of the L register in the memory location specified in bytes two and three of the SHLD 
instruction. SHLD then stores a copy of the H register in the next higher memory location. 



Opcode 
SHLD 



Operand 
address 



The address may be stated as a number, a previously defined label, or an expression. 



3-58 



Chapter 3. Instruction Set 



SHLD is one of the instructions provided for saving the contents of the H and L registers. Alternately, the H 
and L data can be placed in the D and E registers (XCHG instruction) or placed on the stack (PUSH and XTHL 
instructions). 









10 





low addr 


high addr 



Cycles: 
States; 
Addressing: 
Flags: 



5 

16 

direct 
none 



Example: 

Assume that the H and L registers contain OAEH and 29H, respectively. The following is an illustration of the 
effect of the SHLD lOAH instiuction: 



Memory Before SHLD 
Memory After SHLD 



MEMORY ADDRESS 


109 


lOA 


lOB 


IOC 


00 


00 


00 


00 


00 


29 


AE 


00 



SIM (8085 PROCESSOR ONLY) 



SET INTERRUPT MASK 



SIM is a multi-purpose instruction that uses the current contents of the accumulator to perform the following 
functions: Set the interrupt mask for the 8085's RST5,5, RST6.5, and RST7.5 hardware interrupts; reset 
RST7.5's edge sensitive input; ind output bit 7 of the accumulator to the Serial Output Data latch. 



Opcode 



Operand 



SIM 

Operands are not permitted wiih the SIM instruction. However, you must be certain to load the desired bit 
configurations into the accumulator before executing the SIM instruction. SIM interprets the bits in the accumu- 
lator as follows: 



3-59 



Chapter 3. Instruction Set 



7 


6 


5 


4 


3 


2 


1 





SOD 


SDE 


XXX 


R7.5 MSE 


M7.5 


M6.5 


M5.5 



= available 

1 = masked 



['RST7.5 MASK 

-< RST6.5 MASK 

IrST5.5 mask 

rif 0, bits - 2 ignored 
Mask Set Enable \lf 1, mask is set 
"- RESET RST7.5; If 1 , RST7.5 flip flop is reset OFF 
*— ignored 
'—If 1, bit 7 is output to Serial Output Data Latch 
l— Serial Output Data: ignored if bit 6 = 



Accumulator bits 3 and 6 function as enable switches. If bit 3 is set ON (set to 1), the set mask function is 
enabled. Bits through 2 then mask or leave available the corresponding RST interrupt. A 1 bit masks the 
interrupt making it unavailable; a bit leaves the interrupt available. If bit 3 is set OFF (reset to 0), bits 
through 2 have no effect. Use this option when you want to send a serial output bit without affecting the 
interrupt mask. 

Notice that the Dl (Disable interrupts) instruction overrides the SIM instruction. Whether masked or not, RST5.5, 
RST6.5, and RST7.5 are disabled when the Dl instruction is in effect. Use the RIM (Read Interrupt Mask) 
instruction to determine the current settings of the interrupt flag and the interrupt masks. 

if bit 6 is set to 1, the serial output data function is enabled. The processor latches accumulator bit 7 into the 
SOD output where it can be accessed by a peripheral device. If bit 6 is reset to 0, bit 7 is ignored. 

A 1 in accumulator bit 4 resets OFF the RST7.5 input flip flop. Unlike RST5.5 and 6.5, RST7.5 is sensed via a 
processor flip flop that is set when a peripheral device issues a pulse with a rising edge. This edge triggered input 
supports devices that cannot maintain an interrupt request until serviced. RST7.5 is also useful when a device 
does not require any explicit hardware service for each interrupt. For example, the program might increment and 
test an event counter for each interrupt rather than service the device directly. 

The RST7.5 flip flop remains set until reset by 1) issuing a RESET to the 8085, 2) recognizing the interrupt, or 
3) setting accumulator bit 4 and executing a SIM instruction. The Reset RST7.5 feature of the SIM instruction 
allows the program to override the interrupt. 

The RST7.5 input flip flop is not affected by the setting of the interrupt mask or the Dl instruction and there- 
fore can be set at any time. However, the interrupt cannot be serviced when RST7.5 is masked or a Dl instruction 
is in effect. 



1 







Cycles: 
States: 
Flags: 



1 

4 
none 



Example 1; Assume that the accumulator contains the bit pattern 00011100. The SIM instruction resets the 
RST7.5 flip flop and sets the RST7.5 interrupt mask. If an RST7.5 interrupt is pending when this SIM instructio 
is executed, it is overridden without being serviced. Also, any subsequent RST7.5 interrupt is masked and cannot 
be serviced until the interrupt mask is reset. 



3-60 



Chapter 3. Instruction Set 



Example 2: Assume thai the accumulator contains the bit ptittcrn 11001111. The SIM instruction masks out the 
RST5.5, RST6.5, and RST7.5 level interrupts and latches a 1 bit into the SOD input. By contrast, the bit pattern 
100001 1 1 has no effect since the enable bits 3 and 6 are not set to ones. 



SPHL 



MOVE H&L TO SP 



SPHL loads the contents of tiie H and L registers into the SP (Stack Pointer) register. 

Opcode Operand 

SPHL 



Operands are not permitted with the SPHL instruction. 

SP is a special purpose 16-bit register used to address the stack; the stack must be in random access memory 
(RAM). Because different applications use different memory configurations, the user program must load the SP 
register with the stack's beginning address. The stack is usually assigned to the highest available location in RAM. 
The hardware decrements the stack pointer as items are added to the stack and increments the pointer as items 
are removed. 



The stack pointer must be initialized before any instruction attempts to access the stack. Typically, stack 
initialization occurs very early in the program. Once established, the stack pointer should be altered with 
caution. Arbitrary use of SPHL can cause the loss of stack data. 



110 1 



Cycles: 
States: 
Addressing: 
Flags: 



1 

5 (6 on 8085) 

register 

none 



Example: 

Assume that the H and L registers contain 50H and OFFH, respectively. SPHL loads the stack pointer with the 
value 50FFH. 



ST A 



STORE ACCUMULATOR DIRECT 



STA stores a copy of the current accumulator contents into the memory location specified in bytes two and 
three of the STA instruction. 



Opcode 



Operand 



ST/i 



address 



The address may be stated as a number, a previously defined label, or an expression. The assembler inverts the 
high and low address bytes when it builds the instruction. 



3-61 



Chapter 3. Instruction Set 









1 


1 


] 





low addr 


high addr 



Cycles: 


4 


States: 


13 


Addressing: 


direct 


Flags: 


none 



Example: 

The following instruction stores a copy of the contents of the accumulator at memory location 5B3H: 

STA 5B3H 

When assembled, the previous instruction has the hexadecimal value 32 B3 05. Notice that the assembler inverts 
the high and low order address bytes for proper storage in memory. 



STAX 



STORE ACCUMULATOR INDIRECT 



The STAX instruction stores a copy of the contents of the accumulator into the memory location addressed 
by register pair B or register pair D. 



Opcode 



Operand 



STAX 



The operand B specifies the B and C register pair; D specifies the D and E register pair. This instruction may 
specify only the B or D register pair. 









r 


10 






^ 


Jo = register pair B 




1^1 = register pair D 


Cycles; 


2 


States: 


7 


Address 


ng: register indirect 


Flags: 








none 





Example; 

If register B contains 3FH and register C contains 16H, the following instruction stores a copy of the contents 
of the accumulator at memory location 3F16H; 



STAX B 



3-62 



Chapter 3. Instruction Set 



STC 



SET CARRY 



STC sets the carry flag to one. No other flags are affected. 



Opcode 



Operand 



STC 



Operands are not permitted with the STC instruction. 






1 


1 


111 


Cycles: 






1 


States: 






4 


Flags: 






CY 



When used in combination with the rotate accumulator through the carry flag instructions, STC allows the pro- 
gram to modify individual bits. 



SUB 



SUBTRACT 



The SUB instruction subtracis one byte of data from the contents of the accumulator. The result is stored in the 
accumulator. SUB uses two's complement representation of data as explained in Chapter 2. Notice that the SUB 
instruction excludes the carr\' flag (actually a 'borrow' flag for the purposes of subtraction) but sets the flag to 
indicate the outcome of the operation. 



Subtract Register from A ccumulator 

Opcode 



Operand 



SUB 



reg 



The operands must specify one of the registers A through E, H or L. The instruction subtracts the contents of 
the specified register from the contents of the accumulator using two's complement data representation. The 
result is stored in the accumulator. 





1 





1 





S S S 




Cycles: 






1 


States: 






4 


Addressing: 




register 


Flags: 






Z,S,P,CY,AC 


Subtract Memory from A ccumulator 








Opcode 




Operand 


SUB 






M 







3-63 



Chapter 3. Instruction Set 



This instruction subtracts the contents of the memory location addressed by the H and L registers from the 
contents of the accumulator and stores the result in the accumulator. M is a symbolic reference to the H and L 
registers. 



10 10 110 



Cycles: 


2 


States: 


7 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



Example: 



Assume that the accumulator contains 3EH. The instruction SUB A subtracts the contents of the accumulator 
from the accumulator and produces a result of zero as follows: 



3EH = 001 11 no 

-3EH) = 11000001 one's complement 



1 add one to produce two's complement 



carry out = 1 00000000 result = 

The condition flags are set as follows: 

Carry = 

Sign = 

Zero = 1 

Parity = 1 

Aux. Carry - 1 

Notice that the SUB instruction complements the carry generated by the two's complement addition to form a 
'borrow' flag. The auxiliary carry flag is set because the particular value used in this example causes a carry out 
of bit 3. 

SUI SUBTRACT IMMEDIATE 

SUI subtracts the contents of the second instruction byte from the contents of the accumulator and stores the 
result in the accumulator. Notice that the SUI instruction disregards the carry ('borrow') flag during the sub- 
traction but sets the flag to indicate the outcome of the operation. 

Opcode Operand 

SUI data 

The operand must specify the data to be subtracted. This data may be in the form of a number, an ASCII 
constant, the label of some previously defined value, or an expression. The data must not exceed one byte. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 



3-64 



Chapter 3. Instruction Set 



HIGH or LOW operalor to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOW operator and issues an error message. 



110 10 110 



Cycles: 
States: 
Addressing 
Flags: 



2 

7 

immediate 

Z,S,P,CY,AC 



Example: 

Assume that the accumulator contains the value 9 when the instruction SUI 1 is executed: 

Accumulator = 00001001 = 9H 

l-nmediate data (2's comp) = 11111111 = -1 H 

00001000 = 8H 

Notice that this two's complement addition results in a carry. The SUI instruction complements the carry 
generated by the addition to form a 'borrow' flag. The flag settings resulting from this operation are as follows: 



C:arry 




= 





Sign 




:; 





?x'ro 




= 





Parity 




= 





Aux. Ca 


-ry 


= 


1 



XCHG 



EXCHANGE H AND L WITH D AND E 



XCHG exchanges the contents of the H and L registers with the contents of the D and E registers. 



Opcode 



Operand 



XCHG 



Operands are not allowed v/ith the XCHG instruction. 

XCHG both saves the current H and L and loads a new address into the H and L registers. Since XCHG is a 
register-to-regisler instruction, it provides the quickest means of saving and/or altering the H and L registers. 



1110 10 1 



Cycles: 
States: 
Addressing: 
Flags: 



1 

4 

register 
none 



3-65 



Chapter 3. Instruction Set 



Example: 



Assume that the H and L registers contain 1234H, and the D and E registers contain OABCDH. Following 
execution of the XCHG instruction, H and L contain OABCDH, and D and E contain 1234H. 



XRA 



EXCLUSIVE OR WITH ACCUMULATOR 



XRA performs an exclusive OR logical operation using the contents of the specified byte and the accumulator. 
The result is placed in the accumulator. 

Summary of Logical Operations 

AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are 
ones. 

OR produces a one bit in the result when the corresponding bits in either the test data or the mask data are 
ones. 

Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are 
different; i.e., a one bit in either the test data or the mask data - but not both - produces a one bit in the 
result. 



AND 



OR 



EXCLUSIVE OR 



1010 1010 
0000 1111 
0000 1010 



1010 1010 
0000 1 1 1 1 

1010 nil 



1010 1010 
0000 1 1 1 1 
1010 0101 



XRA Register witfi Accumulator 

Opcode 



Operand 



XRA 



reg 



The operand must specify one of the registers A through E, H or L. This instruction performs an exclusive OR 
using the contents of the specified register and the accumulator and stores the result in the accumulator. The 
carry and auxiliary carry flags are reset to zero. 



10 10 



S S S 



Cycles; 


1 


States; 


4 


Addressing: 


register 


Flags; 


Z,S,P,CY,AC 



3-66 



Chapter 3. Instruction Set 



XRA Memory with Accumulator 



Opcode 



Operand 



XRA 



M 



The contents of the memory location specified by the H and L registers is exclusive-ORed with the contents of 
the accumulator. The result is stored in the accumulator. The carry and auxiliary carry flags are reset to zero. 



1 







1 



1 1 



1 







Cycles: 


2 


States: 


7 


Addressing: 


register indirect 


Flags: 


Z,S,P,CY,AC 



Examples: 

Since any bit exclusive-ORed with itself produces zero, XRA is frequently used to zero the accumulator. The 
following instructions zero the accumulator and the B and C registers. 



XRA 


A 


MOV 


B,A 


MOV 


C,A 



Any bit exclusive-ORed with a one bit is complemented. Thus, if the accumulator contains all ones (OFFH) 
the instruction XRA B produces the one's complement of the B register in the accumulator 



XRl 



EXCLUSIVE OR IMMEDIATE WITH ACCUMULATOR 



XRl performs an exclusive OF^ operation using the contents of the second instruction byte and the contents of 
the accumulator. The result is placed in the accumulator. XRl also resets the carry and auxiliary carry flags to 
zero. 



Opcode 



Operand 



XRl 



data 



The operand must specify the data to be used in the OR operation. This data may be in the form of a number, 
an ASCII constant, the label of some previously defined value, or an expression. The data miay not exceed one 
byte. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the 
HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. 
When neither operator is present, the assembler assumes the LOW operator and issues an error message. 



3-67 



Chapter 3. Instruction Set 



1 1 1 


1 


1 1 


data 


Cycles: 
States: 
Addressing: 
Flags: 




2 

7 

immediate 

Z,S,P,CY,AC 



Summary of Logical Operations 

AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are 
ones. 

OR produces a one bit in the result when the corresponding bits in either the test data or the mask data arc 
ones. 

Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are 
different; i.e., a one bit in either the test data or the mask data — but not both produces a one bit in the 
result. 



AND 



OR 



EXCLUSIVE OR 



1010 1010 

0000 nil 

0000 1010 



1010 1010 
0000 1 1 1 1 

1010 nil 



1010 1010 
0000 1 1 1 1 
1010 0101 



Example: 

Assume that a program uses bits 7 and 6 of a byte as flags that control the calling of two subroutines. The 
program tests the bits by rotating the contents of the accumulator until the desired bit is in the carry flag; a 
CC instruction (Call if Carry) tests the flag and calls the subroutine if required. 

Assume that the control flag byte is positioned normally in the accumulator, and the program must set OFF hit 
6 and set bit 7 ON. The remaining bits, which are status flags used for other purposes, must not be altered. 
Since any bit exclusive-ORed with a one is complemented, and any bit exclusive-ORed with a zero remains 
unchanged, the following instruction is used: 



XRI 



llOOOOOOB 



The instruction has the following results: 

Accumulator 
Immediate data 



01001100 
11000000 

10001100 



3-68 



Chapter 3. Instruction Set 



XT HI. 



EXCHANGE H&L WITH TOP OF STACK 



XTHL exchanges two bytes from the top of the stack with the two bytes stored in the H and L registers. Thus, 
XTHL both saves the current contents of the H and L registers and loads new values into H and L. 



Opcode 



Operand 



XTHL 

Operands are not allowed with the XTHL instruction. 

XTHL exchanges the contents of the L register with the contents of the memory location specified by the SP 
(Stack Pointer) register. The contents of the H register are exchanged with the contents of SP+1. 



1110 1 



1 



Cycles: 


5 


States; 


18 (16 on 8085 


Addressing: 


register indirect 


Flags: 


none 



Example: 

Assume that the stack pointer register contains lOADH; register H contains OBH and L contains 3CH; and 
memory locations lOADH and 10AEH contain FOH and ODH, respectively. The following is an illustration of 
the effect of the XTHL instruction: 



MEMORY ADDRESS 


lOAC 


lOAD 


lOAE 


lOAF 


FF 
FF 


FO 
3C 


OD 
OB 


FF 
FF 



Before XTHL 
After XTHL 



The stack pointer register remains unchanged following execution of the XTHL instruction. 



H 


L 






OB 
OD 


3C 

FO 



3-69 



4. ASSEMBLER DIRECTIVES 

This chapter describes the assembler directives used to control the 8080/85 assembler in its generation of object 
code. This chapter excludes the macro directives, which are discussed as a separate topic in Chapter 5. 

Generally, directives have the same format as instructions and can be interspersed throughout your program. 
Assembler directives discussed in this chapter are grouped as follows: 

GENERAL DIRECTIVES: 

• Symbol Definition 

EQU 
SET 

• Data Definition 

DB 
DW 

• Memory Reservation 
DS 

• Conditional Assembly 

IF 

ELSE 

ENDIF 

• Assembler Termination 
END 

LOCATION COUNTER CONTROL AND RELOCATION: 

• Location Counter Control 

AS EG 
DSEG 
CSEG 
ORG 

• Program Linkage 

PUBLIC 
EXTRN 

NAME 
STKLN 



4-1 



Chapter 4. Assembler Directives 



Three assembler directives - E.QU, SET, and MACRO - have a slightly different format from assembly 
language instructions. The EQU, SET, and MACRO directives require a name for the symbol or macro being 
defined to be present in the label field. Names differ from labels in that they must not be terminated with a 
colon (:) as labels are. Also, the LOCAL and ENDM directives prohibit the use of the label field. 



The MACRO, ENDM, and LOCAL directives are explained in Chapter 5. 



SYMBOL DEFINITION 

The assembler automatically assigns values to symbols that appear as instruction labels. This value is the current 
setting of the location counter when the instruction is assembled. (The location counters are explained under 
'Address Control and Relocation,' later in this chapter.) 

You may define other symbols and assign them values by using the EQU and SET directives. Symbols defined 
using EQU cannot be redefined during assembly; those defined by SET can be assigned new values by subsequent 
SET directives. 

The name required in the label field of an EQU or SET directive must not be terminated with a colon. 

Symbols defined by EQU and SET have meaning throughout the remainder of the program. This may cause the 
symbol to have illegal multiple definitions when the EQU or SET directive appears in a macro definition. Use 
the LOCAL directive (described in Chapter 5) to avoid this problem. 



EQU Directive 

EQU assigns the value of 'expression' to the name specified in the label field. 

Label Opcode Operand 

name EQU expression 

The required name in the label Field may not be terminated with a colon. This name cannot be redefined by a 
subsequent EQU or SET directive. The EQU expression cannot contain any external symbol. (External symbols 
are explained under 'Location Counter Control and Relocation,' later in this chapter.) 

Assembly-lime evaluation of EQU expressions always generates a modulo 64K address. Thus, the expression 
always yields a value in the range 0-65,536. 

Example: 

The following EQU directive enters the name ONES into the symbol table and assigns the binary value 
11111111 to it; 

ONES EQU OFFH 



4-2 



Chapter 4. Assembler Directives 



The value assigned by the EQU directive can be recalled in subsequent source lines by referring to its assigned 
name as in the following IF directive: 



IF TYPE EO ONES 



ENDIF 



SET Directive 



SET assigns the value of 'expression' to the name specified in the label field. 

Label Opcode Operand 



SET 



expression 



The assembler enters the value of 'expression' into the symbol table. Whenever 'name' is encountered sub- 
sequently in the assembly, the <i,ssembler substitutes its value from the symbol table. This value remains unchanged 
until altered by a subsequent SET directive. 

The function of the SET directive is identical to EQU except that 'name' can appear in multiple SET directives 
in the same program. Therefore, you can alter the value assigned to 'name' throughout the assembly. 

Assembly-time evaluation of SET expressions always generates a modulo 64K address. Thus, the expression 
always yields a value in the range 0-65,536. 

Examples: 



Lahef 



Opcode 



Operand 



Assembled Code 



IMMED SET 

ADI 



5 
IMMED 



C605 



IMMED SET 

ADI 



lOH-6 
IMMED 



C60A 



DATA DEFINITION 



The DB (define byte) and DW (define word) directives enable you to define data to be stored in your program. 
Data can be specified in the form of 8-bit or 16-bit values, or -is a string of text characters. 



DB Directive 



The DB directive stores the specified data in consecutive memory locations starting with the current setting of the 
location counter. 



4-3 



Chapter 4. Assembler Directives 



Label 



Opcode 



Operands 



optional: 



DB 



expression(s) or string(s) 



The operand field of the DB directive can contain a list of expressions and/or text strings. The list can contain 
up to eight total items; list items must be separated by commas. Because of limited workspace, the assembler 
may not be able to handle a total of eight items when the list includes a number of complex expressions. If 
you ever have this problem, it is easily solved: simply use two or more directives to shorten the list. 

Expressions must evaluate to 1-byte (8-bit) numbers in the range -256 through 255. Text strings may comprise 
a maximum of 128 ASCII characters enclosed in quotes. 

The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of 
these symbols appears in an operand expression of the DB directive, it must be preceded by either the HIGH or 
LOW operator to specify which byte of the address is to be used in the evaluation of the expression. When 
neither operator is present, the assembler assumes the LOW operator and issues an error message. 

If the optional label is present, it is assigned the starting value of the location counter, and thus references 

the first byte stored by the DB directive. Therefore, the label STR in the following examples refers to the letter 

T of the string TIME. 

Examples; 



Label 
STR: 



Opcode 
DB 



Operands 
'TIME' 



Assembled Code 
54494D45 



HERE: 



DB 



0A3H 



A3 



WORDl: DB 



-03H,5*2 FDOA 



DW Directive 



The DW directive stores each 16-bit value from the expression list as an address. The values are stored starting 
at the current setting of the location counter. 



Label 



Opcode 



Operands 



optional: 



DW 



expression list 



The least significant eight bits of the first value in the expression list are stored at the current setting of the 
location counter; the most significant eight bits are stored at the next higher location. This process is repeated 
for each item in the expression list. 

Expressions evaluate to 1— word (16-bit) numbers, typically addresses, if an expression evaluates to a single byte, 
it is assumed to be the low order byte of a 16-bit word where the high order byte is all zeros. 



44 



Chapter 4. Assembler Directives 



List items must be separated by commas. The list can contain up lo eight total items. Because of limited work- 
space, the assembler may not be able to handle eight complex expressions. If you ever have this problem, simply 
use two or more DW directives to shorten the list. 

The reversed order for storing the high and low order bytes is the typical format for addresses stored in memory. 
Thus, the DW directive is commonly used for storing address constants. 

Strings containing one or two ASCII characters enclosed in quotation marks may also appear in the expression 
list. When using such strings in your program, remember that the characters are stored in reversed order. 
Specifying a string longer than two characters causes an error. 

If the optional label is present, it is assigned the starting address of the location counter, and thus references the 
first byte stored by the DW directive. (This is the low order byte of the first item in the expression list.) 

Examples: 

Assume that COMP and FILL arc labels defined elsewhere in the program. COMP addresses memory location 
3B1CH. FILL addresses memory location 3EB4H. 



Label Opcode 

ADDRl: DW 



Operands 
COMP 



Assembled Code 
1C3B 



ADDR2: 



DW 



FILL 



B43E 



STRNG: 



DW 



'A'.'AB' 



41004241 



FOUR: 



DW 



4H 



0400 



MEMORY RESERVATION 



DS Directive 



The DS directive can be used to define a block of storage. 



Label 



Opcode 



Operand 



optional: 



DS 



expression 



The value of 'expression' specifies the number of bytes to be reserved for data storage. In theory, this value may 
range from OOH through OFFFFH; in practice, you will reserve no more storage than will fit in your available 
memory and still leave room for the program. 

Any symbol appearing in the operand expression must be defined before the assembler reaches the DS directive. 

Unlike the DB and DW directives, DS assembles no data into your program. The contents of the reserved storage 
are unpredictable when program execution is initiated. 



4-5 



Chapter 4. Assembler Directives 



If the optional label is present, it is assigned the current value of the location counter, and thus references the 
first byte of the reserved memory block. 

If the value of the operand expression is zero, no memory is reserved. However, if the optional label is present, 
it is assigned the current value of the location counter. 

The DS directive reserves memory by incrementing the location counter by the value of the operand expression. 

Example: 

TTYBUF: DS 72 ;RESERVE 72 BYTES FOR 

;A TERMINAL OUTPUT BUFFER 

Programming Tips: Data Description and Access 

Random Access Versus Read Only Memory 

When coding data descriptions, keep in mind the mix of ROM and RAM in your application. 

Generally, the DB and DW directives define constants, items that can be assigned to ROM. You can use these 
items in your program, but you cannot modify them. If these items are assigned to RAM, they have an initial 
value that your program can modify during execution. Notice, however, that these initial values must be reloaded 
into memory prior to each execution of the program. 

Variable data in memory must be assigned to RAM. 

Data Description 

Before coding your program, you must have a thorough understanding of its input and output data. But you'll 
probably find it more convenient to postpone coding the data descriptions until the remainder of the program is 
fairly well developed. This way you will have a better idea of the constants and workareas needed in your program. 
Also, the organization of a typical program places instructions in lower memory, followed by the data, followed 
by the stack. 

Data Access 

Accessing data from memory is typically a two-step process; First you tell the processor where to find the data, 
then the processor fetches the data from memory and loads it into a register, usually the accumulator. Therefore, 
the following code sequences have the identical effect of loading the ASCII character A into the accumulator. 

AAA: DB 'A' ALPHA: DB 'ABC 



LXI B,AAA LXI B,ALPHA 

LDAX B LDAX B 



4-6 



Chapter 4. Assembler Directives 



In the examples, the LXI instructions load the address of the desired data into the B and C registers. The LDAX 
instructions then load the accumulator with one byte of data from the address specified in the B and C registers. 
The assembler neither knows nor cares that only one character from the three-character field ALPHA has been 
accessed. The program must account for the characters at ALPHA+1 and ALPHA+2, as in the following coding 
sequence; 



ALPHA: 



DB 



'ABC 



LXI B,ALPHA 

LDAX B 

I NX B 

LDAX B 

INX B 

LDAX B 



;DEFINE ALPHA 

;LOAD ADDRESS OF ALPHA 
;FETCH 1ST ALPHA CHAR 

;SET B TO ALPHA+1 
;FETCH 2ND ALPHA CHAR 

;SET B TO ALPHA+2 
;FETCH 3RD ALPHA CHAR 



The coding above is acceptable for short data fields like ALPHA. For longer fields, you can conserve memory 
by setting up an instruction sequence that is executed repeatedly until the source data is exhausted. 



Add Symbols for Data Access 

The following example was presented earlier as an illustration of the DS directive: 
Label Opcode Operand Comment 



TTYBUF: 



DS 



72 



;RESERVE TTY BUFFER 



To access data in this buffer using only expressions such as TTYBLJF + 1, TTYBUF+2, . . . TTYBUF+72 can be 
a laborious and confusing chore, especially when you want only selected fields from the buffer. You can simplify 
this task by subdividing the buffer with the EQU directive: 



Label 


Opcode 


Operand 


Comment 


TTYBUF: 


DS 


72 


;RESERVE TTY BUFFER 


ID 


EQU 


TTYBUF 


;RECORD IDENTIFIER 


NAME 


EQU 


TTYBUF+6 


;20-CHAR NAME FIELD 


NUMBER 


EQU 


TTYBUF+25 


;iO-CHAR EMPLOYEE NL 


DEPT 


EQU 


TTYBUF+35 


;5-CHAR DEPARTMENT 1 


SSNO 


EQU 


TTYBUF+41 


;SOCIAL SEC. NUMBER 


DOH 


EQU 


TTYBUF+50 


;DATE OF HIRE 


DESC 


EQU 


TTYBUF+56 


;10B DESCRIPTION 



4-7 



Chapter 4. Assembler Directives 



Subdividing data as shown in the example simplifies data access and provides useful documentation throughout 
your program. Notice that these EQU directives can be inserted anywhere within the program as you need them, 
but coding them as shown in the example provides a more useful record description. 



CONDITIONAL ASSEMBLY 

The IF, ELSE, and ENDIF directives enable you to assemble portions of your program conditionally, that is, 
only if certain conditions that you specify are satisfied. 

Conditional assembly is especially useful when your application requires custom programs for a number of com- 
mon options. As an example, assume that a basic control program requires customizing to accept input from 
one of six different sensing devices and to drive one of five different control devices. Rather than code some 
thirty separate programs to account for all the possibilities, you can code a single program. The code for the in- 
dividual sensors and drivers must be enclosed by the conditional directives. When you need to generate a custom 
program, you can insert SET directives near the beginning of the source program to select the desired sensor and 
driver routines. 



IF, ELSE, ENDIF Directives 

Because these directives are used in conjunction, they are described together here. 

Label Opcode Operand 

optional: IF expression 

optional: ELSE — 

optional: ENDIF 



The assembler evaluates the expression in the operand field of the IF directive. If bit of the resulting value is 
one (TRUE), all instructions between the IF directive and the next ELSE or ENDIF directive are assembled. 
When bit is zero (FALSE) these instructions are ignored. (A TRUE expression evaluates to OFFFFH and 
FALSE to OH; only bit zero need be tested.) 

All statements included between an IF directive and its required associated ENDIF directive are defined as an 
IF-ENDIF block. The ELSE directive is optional, and only one ELSE directive may appear in an IF-ENDIF 
block. When included, ELSE is the converse of IF. When bit of the expression in the IF directive is zero, all 
statements between ELSE and the next ENDIF are assembled. If bit is one, these statements are ignored. 

Operands are not allowed with the ELSE and ENDIF directives. 

An IF-ENDIF block may appear within another IF-ENDIF block. These blocks can be nested to eight levels. 

Macro definitions (explained in the next chapter) may appear within an IF-ENDIF block. Conversely, IF-ENDIF 
blocks may appear within macro definitions. In either case, you must be certain to terminate the macro definition 



4-8 



Chapter 4. Assembler Directives 



or IF-ENDIF block so that it can be assembled completely. For example, when a macro definition begins in an 
IF block but terminates after an ELSE directive, only a portion of the macro can be assembled. Similarly, an 
IF-ENDIF block begun within a macro definition must terminate within that same macro definition. 

NOTE 



Caution is required when symbols are defined in IF-ENDIF 
blocks and referenced elsewhere within the program. These 
symbols are undefined when the evaluation of the IF ex- 
pression suppresses the assembly of the IF-ENDIF block. 



Example 1. Simple IF-ENDIF Block: 
CONDI; IF TYPE EQ 



;ASSEMBLED IF 'TYPE = 0' 
:iS TRUE 



ENDIF 



Example 2. IF-ELSE-ENDIF Block: 



C0ND2: IF TYPE EQ 



ELSE 



;ASSEMBLED IF TYPE = 0' 
;IS TRUE 



iASSEMBLED IF 'TYPE = 0' 
;IS FALSE 



ENDIF 



4-9 



Chapter 4. Assembler Directives 



Example 3. Nested IP's: 



LEVEL 

2 



C0ND3: IF TYPE EQ 



LEVEL 

1 



LEVEL 
1 



IF MODE EQ 1 



ENDIF 
ELSE 



IF MODE EQ 2 



ELSE 



ENDIF 
ENDIF 



ASSEMBLER TERMINATION 



ASSEMBLED IF TYPE = 0' 
;IS TRUE 



ASSEMBLED IF TYPE = 0' 
AND 'MODE = r ARE BOTH 
TRUE 



;ASSEMBLED IF TYPE = 0' 
;IS FALSE 



ASSEMBLED IF TYPE = 0' 
IS FALSE AND 'MODE = 2' 
IS TRUE 



ASSEMBLED IF 'TYPE = 0' 
AND 'MODE = 2' ARE BOTH 
FALSE 



END Directive 



The END directive identifies the end of the source program and terminates each pass of the assembler. 

Label Opcode Operand 



optional 



END 



expression 



Only one END statement may appear in a source program, and it must be the last source statement. 

If the optional expression is present, its value is used as the starting address for program execution. If no ex- 
pression is given, the assembler assumes zero as the starting address. 

When a number of separate program modules are to be joined together, only one may specify a program starting 
address. The module with a starting address is the main module. When source files are combined using the IN- 
CLUDE control, there are no restrictions on which source file contains the END. 



4-10 



Chapter 4. Assembler Directives 



END-OF-TAPE INDICATION 

The EOT directive allows you to specify the physical end of paper tape to simplify assembly of multiple-tape source 
programs. 

EOT Directive 

Label Opcode Operand 

optional: EOT 

When EOT is recognized l3y the assembler, the message 'NEXT TAPE' is sent to the console and the assembler pauses. 
After the next tape is loaded, a 'space bar' character received at the console signals continuation of the assembly. 

Data in the operand field causes an error. 

LOCATION COUNTER CONTROL AND RELOCATION 

All the directives discussed in the remainder of this chapter relate directly to program relocation except for the 
ASEG and ORG directives. These directives are described first for the convenience of readers who do not use the 
relocation feature. 



Location Counter Control (Non-Relocatable Mode) 

When you elect not to use the relocation feature, an assembler default generates an ASEG directive for you. The 
ASEG directive specifies that the program is to be assembled in the non-relocatable mode and establishes a 
location counter for the assembly. 

The location counter performs the same function for the assembler as the program counter performs during 
execution. It tells the assembler the next memory location available for instruction or data assembly. 

Initially, the location counter is set to zero. The location counter can be altered by the ORG (origin) directive. 



ORG Directive 

The ORG directive sets the location counter to the value specified by the operand expression. 

Label Opcode Operand 

optional: ORG expression 

The location counter is set to the value of the operand expression. Assembly-time evaluation of ORG expressions 
always yields a modulo 64K address. Thus, the expression always yields an address in the range through 
65,535. Any symbol in the expression must be previously defined. The next machine instruction or data item is 
assembled at the specified address. 



4-11 



Chapter 4. Assembler Directives 



If no ORG direclive is included before the first instruction or data byte in your program, assembly begins at 
location zero. 

Your program can include any number of ORG directives. Multiple ORG's need not specify addresses in 
ascending sequence, but if you fail to do so, you may instruct the assembler to write over some previously 
assembled portion of the progiam. 

If the optional label is present, it is assigned the current value of the location counter before it is updated by the 
ORG directive. 

[ixample: 

Assume that the current value of the location counter is OFH (decimal 1 5) when the following ORG directive is 
encountered: 

PAGl: ORG OFFH ,-ORG AS.SEMBLER TO LOCATION 

;OFFH (decimal 225) 

The symbol PAGl is assigned the address OFH. The next insltuction or data byte is assembled at location 
OFFH. 



Introduction to Relocatability 

A major feature of this assembler is its system for creating relocatable object code modules. Support for this new 
feature includes a number of new directives for the assembler and three new programs included in ISIS-ll. The 
three new programs LIB, LINK, and LOCATE are described in the ISISTI System User's Guide. The new 
assembler directives are described later in this chapter. 

Relocatability allows the programmer to code programs or sections of programs without worrying about the 
final arrangement of the object code in memory. This offers developers of microcomputer systems major ad- 
vantages in two areas: memoiy management and modular program development. 



Memory Management 

When developing, testing, and debugging a system on your Intellec microcomputer development system, your 
only concern with locating a program is that it doesn't overlap the resident routines of ISIS-ll. Because the 
Sntellec system has 32K, 48K, or 64K of random access memory, the location of your luture program is not a 
great concern. However, the p'ogram you are developing will almost certainly use some mix of random access 
memory (RAM), read-only memory (ROM), and/or programmable read-only memory (PROM). Therefore, the 
location of your program affects both cost and performance in your application. The relocatability feature allows 
you to develop, test, and debug your program on the Intellec development system and then simply relocate the 
object code to suit your application. 

The relocatability feature also has a major advantage at assembly-time: often, large programs with many symbols 
cannot be assembled because of limited work space for the symbol table. Such a program can be divided into a 
number of modules that can be assembled separately and then linked together to form a single object program. 



4-12 



Chapter 4. Assembler Directives 



Modular Program Development 

Although 'relocatjbility' may seem to be a formidable term, what it really means is that you can subdivide a 
complex program into a number cf smaller, simpler programs. This concept is best illustrated through the use of 
an example. Assume that a p-iicrocomputer program is to control the spark advance on an automobile engine. 
This requires the program to sample the ambient air temperature, engine air intake temper.iture, coolant tempera- 
ture, manifold vacuum, idle sensor, and throttle sensor. 

Let us examine the approaches two different programmers might take to solve this problem. Both programmers 
want to calculate the degree of spark advance or retardation that provides the best fuel economy with the lowest 
emissions. Programmer A codes a single program that senses all inputs and calculates the correct spark advance. 
Programmer B uses a modular approach and codes separate programs for each input plus one program to calculate 
spark advance. 

Although Programmer A avoids the need to learn to use the relocalability feature, the modular approach used 
by Programmer B has a number of advantages you should consider: 

• Simplified Program Development 

It is generiilly easier to code, test, and debug sevcr.ii simple programs than one complex program. 

• Sharing the Programming Task 

If Programmer B finds that he is falling behind schedule, he can assign one oi more of his sub- 
programs to <ui(jther programmer. Because of his single program concept, Programmer A will 
probably have to complete the program himself. 

• [:<ise of Testing 

Progr<immer B can test and debug most of his modules as soon as they are assembled; Programmer 
A must test his program <is a whole. Notice that Programmer B has an extra advantage if the 
sensors arc being developed at the same time as the program. If one of the sensors is behind 
schedule, Programmer B can continue developing and testing programs for the sensors that are 
ready. Because Programmer A cannot test his program until all the sensors arc developed, his 
testing schedule is dependent on events beyond his control. 

• Programming Changes 

Given the nature of automotive design, it is reasonable to expect some changes during system 
development. If a change lo one of the sensors requires a programming change. Programmer A 
must search through his entire program to find and alter the coding for that sensor. Then he must 
retest the entire program to be certain that those changes do nut .iffect any of the other sensors. 
By contrast, Programmer B need be concerned only with the module for thai one sensor. This 
.idvantagc continues throughout the life of the program. 



4-13 



Chapter 4. Assembler Directives 



DIRECTIVES USED FOR RELOCATION 



Several directives have been added to the assembler to support the relocation feature. These fall into the general 
categories of location counter control and program linkage. 



Location Counter Control (Relocatable Programs) 

Relocatable programs or program modules may use three location counters. The ASEG, DSEG, and CSEG 
directives specify which location counter is to be used. 

The ASEG directive specific-, an absolute code segment. Even in a relocatable program module, you may want 
to assign certain code segments to specific addresses. For example, restart routines invoked by the RST instruc- 
tion require specific addresses. 

The CSEG directive specifies a relocatable code segment. In general, the CSEG location counter is used for por- 
tions of the program that are to be in some form of read-only memory, such as machine instructions and pro- 
gram constants. 

The DSEG location counter specifies a relocatable data segment. This location counter is used for program 
elements that must be located in random access memory. 

These directives allow you to control program segmentation at assembly time. The LOCATE program, described 
in the ISIS-II System User's Guide, gives you control over program segment location. Therefore, the guidelines 
given above are only general since they can be overridden by the LOCATE program. 

Regardless of how many times the ASEG, CSEG, and DSEG directives appear in your program, the assembler 
produces a single, contiguoLis module. This module comprises four segments; code, data, stack and memory. 
The LINK and LOCATE programs are used to combine segments from individual modules and relocate them in 
memory. These programs are explained in the ISIS-II System User's Guide. 



ASEG Directive 

ASEG directs the assembler to use the location counter for the absolute program segment. 

Label Opcode Operand 

optional; ASEG — 

Operands are not permitted with the ASEG directive. 

All instructions and data fo, lowing the ASEG directive are assembled in the absolute mode. The ASEG directive 
remains in effect until a CSEG or DSEG directive is encountered. 

The ASEG location counter has an initial value of zero. The ORG directive can be used to assign a new value to 
the ASEG location counter. 



4-14 



Chapter 4. Assembler Directives 



When assembly begins, the assembler assumes the ASEG directive to be in effect. Therefore, a CSEG or DSEG 
must precede the first instruction or data definition in a relocatable module. If neither of these directives 
appears in the program, the entire program is assembled in absolute mode and can be executed immediately 
after assembly without using the LINK or LOCATE programs. 



CSEG Directive 

CSEG directs the assembler to assemble subsequent instructions and data in the relocatable mode using the code 
segment location counter. 

Label Opcode Operand 

r blank 
optional: CSEG < PAGE 

NPAGE 






When a program contains multiple CSEG directives, all CSEG directives throughout the program must specify 
the same operand. The operand of a CSEG directive has no effect on the current assembly, but is stored with 
■the object code to be passed lo the LINK and LOCATE programs. (These programs are described in the ISiS-li 
System User's Guide.) The LOCATE program uses this information lo determine relocation boundaries when it 
joins this code segment to code segments from other programs. The meaning of the operand is as follows: 

• blank - This code segment may be relocated to the next available byte boundary. 

• PAGE This code segment must begin on a page boundary when relocated. Page boundaries 
occur in multiples of 256 bytes beginning with zero (0, 256, 512, etc.). 

• INPAGE — This code segment must fit within a single page when relocated. 

The CSEG directive remains in effect until an ASEG or DSEG directive is encountered. 

The code segment location counter has an initial value of zero. The ORG directive can be used to assign a new 
value to the CSEG location counter. 



DSEG Directive 

DSEG directs the assembler to assemble subsequent instructions and data in the relocatable mode using the data 
segment location counter. 

Label Opcode Operand 

r blank 
optional: DSEG / PAGE S 

\ INPAGE j 

When multiple DSEG directives appear in a program, they must all specify the same operand throughout the 
program. The operands for the DSEG directive have the same meaning as for the CSEG directive except that 
they apply to the data segment. 



4-15 



Chapter 4. Assembler Directives 



There is no interaction between the operands specified for the DSEG and CSEG directives. Thus, a code segment 
can be byte relocatable while the data segment is page relocatable. 

The DSEG directive remains in effect until an ASEG or CSEG directive is encountered. 

The data segment location counter has an initial value of zero. The ORG directive can be used to assign a new 
value to the DSEG location counter. 



ORG Directive (Relocatable Mode) 

The ORG directive can be used to alter the value of the location counter presently in use. 

Label Opcode Operand 

optional: ORG expression 

There are three location counters, but only one location counter is in use at any given point in the program. 
Which one depends on whether the ASEG, CSEG, or DSEG directive is in effect. 

Any symbol used in the operand expression must have been previously defined. An exception causes phase 
errors for all labels that follow the ORG and a label error if the undefined error is defined later. 

When the ORG directive appears in a relocatable program segment, the value of its operand expression must be 
either absolute or relocatable within the current segment. Thus, if the ORG directive appears within a data seg- 
ment, the value of its expression must be relocatable within the data segment. An error occurs if the expression 
evaluates to an address in the code segment. 

If the optional label is present, it is assigned the current value of the location counter presently in use before 
the ORG directive is executed. 

Program Linkage Directives 

Modular programming and ttie relocation feature enable you to assemble and test a number of separate programs 
that are to be joined together and executed as a single program. Eventually, it becomes necessary for these 
separate programs to communicate information among themselves. Establishing such communication is the 
function of the program linkage directives. 

A program may share its data addresses and instruction addresses with other programs. Only items having an 
entry in the symbol table can be shared with other programs; therefore, the item must be assigned a name or a 
label when it is defined in the program. Items to be shared with other programs must be declared in a PUBLIC 
directive. 

Your program can directly access data or instructions defined in another program if you know the actual 
address of the item, but this is unlikely when both programs use relocation. Your program can also gain access 
to data or instructions declared as PUBLIC in other programs. Notice, however, that the assembler normally 



4-16 



Chapter 4. Assembler Directives 



flags as an error any reference to a name or label that has not been defined in your program. To avoid this, 
you must provide the assembler with a list of items used in your program but defined in some other program. 
These items must be declared in an EXTRN directive. 

The two remaining program linkage directives, NAME and STKLN, are individually explained later in this chapter. 



PUBLIC Directive 

The PUBLIC directive makes each of the symbols listed in the operand field available for access by other programs. 

Label Opcode Operands 

optional: PUBLIC name list 

Eiach item in the operand name list must be the name or label assigned to data or an instruction elsewhere in 
this program. When multiple names appear in the list, they must be separated by commas. Each name may be 
declared PUBLIC only once in a program module. Reserved words and external symbols (see the EXTRN 
directive below) cannot be declared to be PUBLIC symbols. 

PUBLIC directives may appear anywhere within a program. module. 

if an item in the operand name list has no corresponding entry in the symbol table (implying that it is unde- 
fined), it is flagged as an error. 

Example: 

PUBLIC SIN,COS,TAN,SQRT 

EXTRN Directive 

The EXTRN directive provides the assembler with a list of symbols referenced in this program but defined in a 
different program. Because of this, the assembler establishes linkage to the other program and does not flag the 
undefined references as errors. 

Label Opcode Operands 

optional: EXTRN name list 

Each item in the name list identifies a symbol that may be referenced in this program but is defined in another 
program. When multiple items appear in the list, they must be sep<iiatcd b^ commas. 

if a symbol in the operand name -list is also defined in this program by the user, or is a reserved symbol, the effect 
is the same as defining the same symbol more than once in a program. The assembler flags this error. 

EXTRN directives may appear anywhere within a program module. 

A symbol may be declared to be external only once in a program module. Symbols declared to be PUBLIC cannot 
also be declared to be EXTi^N symbols. 

4-17 



Chapter 4. Assembler Directives 

If you omit a symbol from the name— list but reference it in the program, the symbol is undefined. The assembler 
flags this error. You may include symbols in the operand name -list that are not referenced in the program with- 
out causing an error. 

Example: 

EXTRN ENTRY.ADDRTN, BEGIN 

NAME Directive 

The NAME directive assigns a name to the object module generated by this assembly. 

Label Opcode Operand 

optional; NAME module-name 

The NAME directive requires the presence of a module-name in the operand field. This name must conform to 
the rules for defining symbols. 

Module names are necessary so that you can refer to a module and specify the proper sequence of modules 
when a number of modules are to be bound together. 

The NAME directive must precede the first data or instruction coding in the source program, but may follow 
comments and control lines. 

If the NAME directive is missing from the program, the assembler supplies a default NAME directive with the 
module— name MODULE. This will cause an error if you attempt to bind together several object program 
modules and more than one has the name MODULE. Also, if you make an error coding the NAME directive, 
the default name MODULE is assigned. 

The module name assigned by the NAME directive appears as part of the page heading in the assembly listing. 

Example: 

NAME MAIN 

STKLN Directive 

Regardless of the number of object program modules you may bind together, only one stack is generated. The 
STKLN directive allows you to specify the number of bytes to be reserved for the stack for each module. 

Label Opcode Operand 

optional: STKLN expression 

The operand expression must evaluate to a number which will be used as the maximum size of the stack. 



4-18 



Chapter 4. Assembler Directives 



When ihe STKLN directive is omitled, the assembler provides a default STKLN of zero. This is useful when 
multiple programs are bound tcigether; only one stack will be generated, so only one program module need 
specify the stack size. However, you should provide a STKLN if your module is to be tested separately and 
uses the stack. 

If your program includes more than one STKLN directive, only the last value assigned is retained. 

Example: 

STKLN 100 

STACK and MEMORY Reserved Words 

The reserved words STACK and MEMORY are not directives but are of interest to programmers using the 
relocation feature. These reserved words are external references whose addresses are supplied by the LOCATE 
program. 

STACK is the symbolic reference to the stack origin address. You need this address to initialize the stack 
pointer register. Also, you can base data structures on this address using symbolic references such as STACK+1, 
STACK+2, etc. 

MEMORY is the symbolic reference to the first byte of unused memory past the end of your program. Again, 
you can base data structures on this address using symbolic references such as MEMORY, MEMORY+1, etc. 

Programming Tips: Testing Relocatable Modules 

The ability to test individual program modules is a major advantage of modular programming. However, many 
program modules are not logically self-sufficient and require ^ome modification before they can be tested. The 
following is a discussion of some of the more common modifications that may be required. 

Initiali/ation Routines 

In most complete programs, a number of housekeeping or initialization procedures ,jre perforined when execution 
first begins. If the program module you are testing relies on initialization procedures assigned to a different 
miodule, you must duplicate those procedures in the module to be tested. (Notice, however, that you can link 
any number of modules together for testing.) 

One of the most important initialization procedures is to set the stack pointer. The LOCATE program determines 
the origin of the stack. 

Your program should include the following instruction to initialize the stack pointer: 

LXI SP.STACK 



4-19 



Chaplet 4. Assembler Directives 



IripUtlOUtpUt 

When testing program modules, it is lil<ely that some input or output procedures appear in other modules. Your 
program must simulate any of these procedures it needs to operate. Since your Intellec development system 
probably has considerably more random access memory than you need to test a program module, you may be 
able to simulate input and output data right in memory. The LOCATE program supplies an address for the 
reserved word MEMORY; this is the address of the first byte of unused memory past the end of your program. 
You can access this memory using the symbolic reference MEMORY, MEMORY+1, and so on. This memory 
can be used for storing test data or even for a program that generates test data. 



Remove Coding Used for Testing] 

After testing your program, be certain to remove any code you inserted for testing. In particular, make certain 
that only one module in the complete program initializes the stack pointer. 



4-20' 



5. MACROS 



INTRODUCTION TO MACROS 

Why Use Macros? 

A macro is essentially a facility for replacing one set of parameters with another. In developing your program, 
you will frequently find that n-iany instruction sequences are repeated several times with only certain parameters 
changed. 

As an example, suppose that you code a routine that moves five bytes of data from one memory location to 
another. A little later, you find yourself coding another routine to move four bytes from a different source 
field to a different destination field. If the two routines use the same coding techniques, you will find that 
they are identical except for three parameters; the character count, the source field starting address, and the 
destination field starting address. Certainly it would be handy if there were some way to regenerate that original 
routine substituting the new parameters rather than rewrite that code yourself. The macro facility provides this 
capability and offers several (Jther advantages over writing code repetitiousiy : 

• The tedium of frequent rewrite (and the probability of error) is reduced. 

• Symbols used in macros can be restricted so that they have meaning only within the macro itself. 
Therefore, as you code your program, you need not worry that you will ace dentally duplicate a 
symbol used in a macro. Also, a macro can be used any number of times in the same program 
without duplicating any of its own symbols. 

• An error detected in a macro need be corrected only once regardless of how many times the macro 
appears in the program. This reduces debugging time. 

• Duplication of effort between programmers can be reduced. Useful functions can be collected in a 
library to allow macros to be copied into different programs. 

in addition, macros can be used to improve program readability and to create structured programs. Using macros 
to segment code blocks provides clear program notation and simplifies tracing the flow of the program. 



What Is A Macro? 

A macro can be described as a routine defined in a formal sequence of prototype instructions that, when called 
within a program, results in the replacement of each such call with a code expansion consisting of the actual 
instructions represented. 



5-1 



Chapter 5. Macros 



The concepts of macro definition, call, and expansion can be illustrated by a typical business form letter, where 
the prototype instructions consist of preset text. For example, we could define a macro CNFIRM with the text 

Air Flight welcomes you as a passenger. 

Your flight number FF^IO leaves at DTIME and arrives in DEST at ATIME. 

This macro has four dummy parameters to be replaced, when the macro is called, by the actual flight number, 
departure time, destination, and arrival time. Thus the macro call might look like 

CNFIRM 123, '10:45', 'Ontario', '11:52' 

A second macro, CAR, could be called if the passenger has requested that a rental car be reserved at the desti- 
nation airport. This macro might have the text 

Your automobile reservation has been confirmed with MAKE rent-a-car agency. 
Finally, a macro GREET could be defined to specify the passenger name. 

Dear NAME: 

The entire text of the business letter (source file) would then look like 

GREET 'Ms. Scanner ^ 

CNFIRM 123, '10:45', 'Ontario', '11:52' 

CAR 'Blotz' 

We trust you will enjoy your flight. 

Sincerely, 

When this source file is passed through a macro processor, the macro calls are expanded to produce the following 
letter. 

Dear Ms. Scannel: 

Air Flight welcomes you as a passenger. Your flight number 123 leaves at 10:45 and arrives 
in Ontario at 11:52. Your automobile reservation has been confirmed with Blotz rent-a-car 
agency. 

We trust you will enjoy your flight. 

Sincerely, 

While this example illustrates the substitution of parameters in a macro, it overlooks the relationship of the macro 
processor and the assembler. The purpose of the macro processor is to generate source code which is then 
assembled. 



5-2 



Chapter 5. Macros 



Macros Vs. Subroutines 

At this point, you may be wondering how macros differ from subroutines invol<ed by the CALL instruction. 
Both aid program structuring and reduce the coding of frequently executed routines. 

One distinction between the two is that subroutines necessarily branch to another part of your program while 
macros generate in-line code. Thus, a program contains only one version of a given subroutine, but contains as 
many versions of a given macro as there are calls for that macro. 

Notice the emphasis on 'versions' in the previous sentence, for this is a major difference between macros and 
subroutines. A macro does not necessarily generate the same source code each time it is called. By changing the 
parameters in a macro call, you can change the source code the macro generates. In addition, macro parameters 
can be tested at assembly-time by the conditional assembly directives. These two tools enable a general-purpose 
macro definition to generate customized source code for a particular programming situation. Notice that macro 
expansion and any code customization occur at assembly-time and at the source code level. By contrast, a 
generalized subroutine resides in your program and requires execution time. 

It is usually possible to obtain similar results using either a macro or a subroutine. Determining which of these 
facilities to use is not always an obvious decision. In some cases, using a single subroutine rather than multiple 
in-line macros can reduce the overall program size. In situations involving a large number of parameters, the use 
of macros may be more efficient. Also, notice that macros can call subroutines, and subroutines can contain 
macros. 



USING MACROS 

The assembler recognizes the following macro operations: 

MACRO directive 
ENDM directive 
LOCAL directive 
REPT directive 
IRP directive 
I RFC directive 
EXITM directive 
Macro call 

All of the directives listed above are related to macro definition. The macro call initiates the parameter sub- 
stitution (macro expansion) process. 



Macro Definition 

Macros must be defined in your program before they can be used. A macro definition is initialed by the MACRO 
assembler directive, which lists the name by which the macro can later be called, and the dummy parameters to 
be replaced during macro expansion. The macro definition is terminated by the ENDM directive. The prototype 
instructions bounded by the MACRO and ENDM directives are called the macro body. 



5-3 



Chapter 5. Macros 



When label symbols used in a macro body have 'global' scope, multiply-defined symbol errors result if the macro 
is called more than once. A label can be given limited scope using the LOCAL directive. This directive assigns a 
unique value to the symbol each time the macro is called and expanded. Dummy parameters also have limited 
scope. 

Occasionally you may wish to duplicate a block of code several times, either within a macro or in line with 
other source code. This can be accomplished with minimal coding effort using the REPT (repeat block), IRP 
(indefinite repeat), and IRPC (indefinite repeat character) directives. Like the MACRO directive, these directives 
are terminated by ENDM. 

The EXITM directive provides an alternate exit from a macro. When encountered, it terminates the current macro 
just as if ENDM had been encountered. 



Macro Definition Directives 

MACRO Directive 

Label Opcode Operand 

name MACRO optional dummy parameter(s) 

The name in the label field specifies the name of the macro body being defined. Any valid user-defined symbol 
name can be used as a macro name. Note that this name must be present and must not be terminated by a colon. 

A dummy parameter can be any valid user-defined symbol name or can be null. When multiple parameters are listed, 
they must be separated by commas. The scope of a dummy parameter is limited to its specific macro definition. If a 
reserved symbol is used as a dummy parameter, its reserved value is not recognized. For example, if you code 
A,B,C as a dummy parameter list, substitutions will occur properly, However, you cannot use the accumulator 
or the B and C registers within the macro. Because of the limited scope of dummy parameters, the use of these 
registers is not affected outside the macro definition. 

Dummy parameters in a comment are not recognized. No substitution occurs for such parameters. 

Dummy parameters may appear in a character string. However, the dummy parameter must be adjacent to an 
ampersand character (&) as explained later in this chapter. 

Any machine instruction or applicable assembler directive can be included in the macro body. The distinguishing 
feature of macro prototype text is that parts of it can be made variable by placing substitutable dummy param- 
eters in instruction fields. These dummy parameters are the same as the symbols in the operand field of the 
MACRO directive. 

Example; 

Define macro MAGI with dummy parameters G1, G2, and G3. 



5-4 



Chapter 5. Macros 



NOTE 

The following macro definition contains a potential error 
that is clarified in the description of the LOCAL directive 
later in this chapter. 



MACl 


MACRO 


G1,G2,G3 


;MACRO DIRECTIVE 


MOVES; 


LHLD 


G1 


;MACRO BODY 




MOV 


A,M 






LHLD 


G2 






MOV 


B,M 






LHLD 


G3 






MOV 


CM 






ENDM 




;ENDM DIRECTIVE 



ENDM Directive 



Label 



Opcode 



Operand 



ENDM 

The ENDM directive is required to terminate a macro definition and follows the last prototype instruction. It is 
also required to terminate code repetition blocks defined by the REPT, IRP, and IRPC directives. 

Any data appearing in the label or operand fields of an ENDM directive causes an error. 

NOTE 

Because nested macro calls are not expanded during macro 
definition, the ENDM directive to close an outer macro can- 
not be contained in the expansion of an inner, 'nested' 
macro call. (See 'Nested Macro Definitions' later in this 
chapter.) 

LOCA L Directive 



Label 



Opcode 
LOCAL 



Operand 
label name(s) 



The specified label names are defined to have meaning only within the current macro expansion. Each lime the 
macro is called and expanded, the assembler assigns each local symbol a unique symbol in the form ??nnnn. 

The assembler assigns ??0001 to the first local symbol, ??0002 to the second, and so on. The most recent symbol 
name generated always indicates the total number of symbols created for all macro expansions. The assembler 
never duplicates these symbols. The user should avoid coding symbols in the form ??nnnn so thai there will not 
be a conflict with these assembler-generated symbols. 



5-5 



Chapter 5. Macros 



Dummy parameters included in a macro call cannot be operands of a LOCAL directive. The scope of a dummy 
parameter is always local to its own macro definition. 

Local symbols can be defined only within a macro definition. Any number of LOCAL directives may appear in 
a macro definition, but they must all follow the macro call and must precede the first line of prototype code. 

A LOCAL directive appearing outside a macro definition causes an error. Also, a name appearing in the label 
field of a LOCAL directive causes an error. 

Example: 

The definition of MAC1 (used as an example in the description of the MACRO directive) contains a potential 
error because the symbol MOVES has not been declared local. This is a potential error since no error occurs if 
MAC1 is called only once in the program, and the program itself does not use MOVES as a symbol. However, 
if MAC! is called more than once, or if the program uses the symbol MOVES, MOVES is a multiply-defined 
symbol. This potential error is avoided by naming MOVES in the operand field of a LOCAL directive; 

MAC! 

MOVES; 



MACRO 


G1,G2,G3 


LOCAL 


MOVES 


LHLD 


G1 


MOV 


A,M 


LHLD 


G2 


MOV 


B,M 


LHLD 


G3 


MOV 


C,M 


ENDM 





Assume that MAC! is the only macro in the program and that it is called twice. The first time MAC! is expanded, 
MOVES is replaced with the symbol ??0001; the second time, MOVES is replaced with ??0002. Because the 
assembler encounters only these special replacement symbols, the program may contain the symbol MOVES 
without causing a multiple definition. 



REPT Directive 

Label Opcode Operand 

optional; REPT expression 

The REPT directive causes a sequence of source code lines to be repeated 'expression' times. All lines appearing 
between the REPT directive and a subsequent ENDM directive constitute the block to be repeated. 

When 'expression' contains symbolic names, the assembler must encounter the definition of the symbol prior to 
encountering the expression. 

The insertion of repeat blocks is performed in-line when the assembler encounters the REPT directive. No 
explicit call is required to cause the code insertion since the definition is an implied call for expansion. 



5-6 



Chapter 5. Macros 



Example 1 : 



Rotate accumulator right six times. 

R0TR6: 



REPT 6 

RRC 

ENDM 



Example 2: 

The following REPT directive generates the source code for a routine that fills a five-byte field with the character 
stored in the accumulator: 



PROGRAM CODE 



GENERA TED CODING 



LHLD 


CNTRl 


LHLD 


CNTRl 


REPT 


5 


MOV 


M,A 


MOV 


M,A 


INX 


H 


INX 


H 


MOV 


M,A 


ENDM 




INX 


H 






MOV 


M,A 






INX 


H 






MOV 


M,A 






INX 


H 






MOV 


M,A 






INX 


H 



Example 3: 

The following example illustrates the use of REPT to generate a multiplication routine. The multiplication is 
accomplished through a series of shifts. If this technique is unfamiliar, refer to the example of multiplication 
in Chapter 6. The example in Chapter 6 uses a program loop for the multiplication. This example replaces the 
loop with seven repetitions of the four instructions enclosed by the REPT— ENDM directives. 

Notice that the expansion specified by this REPT directive causes the label SKIPAD to be generated seven times. 
Therefore, SKIPAD must be declared local to this macro. 



FSTMUL; 



SKIPAD: 



MVI 


D,0 ; 


LXI 


H,0 ; 


REPT 


7 


LOCAL 


SKIPAD 


RLC 




JNC 


SKIPAD ; 


DAD 


D ; 


DAD 


H 


ENDM 




RLC 




RNC 




DAD 


D 


RET 





FAST MULTIPLY ROUTINE 
MULTIPLY E*A - 16-BIT RESULT 
IN H&L 



GET NEXT MULTIPLIER BIT 

DONT ADD IF BIT = 

ADD MULTIPLICAND INTO ANSWER 



5-7 



Chapter 5. Macros 



This example illustrates a classic programming trade-off: speed versus memory. Although this example executes 
more quickly than the example in Chapter 6, it requires more memory. 



IRP Directive 



Label 



Opcode 



Operand 



optional: 



IRP 



dummy param, <list> 



The operand field for the IRP (indefinite repeat) directive must contain one macro dummy parameter follovk'ed 
by a list of actual parameters enclosed in angle brackets. IRP expands its associated macro prototype code sub- 
stituting the first actual parameter for each occurrence of the dummy parameter. IRP then expands the proto- 
type code again substituting the second actual parameter from the list. This process continues until the list is 
exhausted. 

The list of actual parameters to be substituted for the dummy parameter must be enclosed in angle brackets 
(< >), Individual items in the list must be separated by commas. The number of actual parameters in the list 
controls the number of times the macro body is repeated; a list of n items causes n repetitions. An empty list 
(one with no parameters coded) specifies a null operand list. IRP generates one copy of the macro body sub- 
stituting a null for each occurrence of the dummy parameter. Also, two commas with no intervening character 
create a null parameter within the list. (See 'Special Operators' later in this chapter for a description of null 
operands.) 

Example: 

The following code sequence gathers bytes of data from different areas of memory and then stores them in 
consecutive bytes beginning at the address of STORIT: 



PROGRAM CODE 



GENERA TED CODING 



LXI 


H.STORIT 


LXI 


H.STORIT 


IRP 


X,<FLD1 


,3E20H,FLD3> 


LDA 


FLD1 


LDA 


X 




MOV 


M,A 


MOV 


M,A 




INX 


H 


INX 


H 




LDA 


3E20H 


ENDM 






MOV 
INX 
LDA 
MOV 

INX 


M,A 

H 

FLD3 

M,A 

H 



IRPC Directive 



Label 



Opcode 



Operand 



optional: 



IRPC 



dummy param, text 



5-8 



Chapter 5. Macros 



The IRPC (indefinite repeat character) directive causes a sequence of macro prototype instructions to be repeated 
for each text character of the actual parameter specified. If the text string is enclosed in optional angle brackets, 
any delimiters appearing in the text string are treated simply as text to be substituted into the prototype code. 
The assembler generates one iteration of the prototype code for each character in the text string. For each 
iteration, the assembler substitutes the next character from the string for each occurrence of the dummy param- 
eter. A list of n text characters generates n repetitions of the IRPC macro body. An empty string specifies a 
null actual operand. IRPC generates one copy of the macro body substituting a null for each occurrence of the 
dummy parameter. 

Example: 



PROGRAM CODE 



GENERA TED CODING 



MVDATE; 



LHLD DATE-1 

IRPC X,1977 

INX H 

MVI M,X 
ENDM 



LHLD 


DATE-1 


INX 


H 


MVI 


M,l 


INX 


H 


MVI 


M,9 


INX 


H 


MVI 


M,7 


INX 


H 


MVI 


M,7 



IRPC provides the capability to treat each character of a string individually; concatenation (described later in this 
chapter) provides the capability for building text strings from individual characters. 



EXITM Directive 



Label 



Opcode 



Operand 



optional: 



EXITM 



EXITM provides an alternate method for terminating a macro expansion or the repetition of a REPT, IRP, or 
IRPC code sequence. When EXITM is encountered, the assembler ignores all macro prototype instructions 
located between the EXITM and ENDM directive for this macro. Notice that EXITM may be used in addition 
to ENDM, but not in place of ENDM. 

When used in nested macros, EXITM causes an exit to the previous level of macro expansion. An EXITM within 
a REPT, IRP, or IRPC terminates not only the current expansion, but all subsequent iterations as well. 

Any data appearing in the operand field of an EXITM directive causes an error. 

Example: 

EXITM is typically used to suppress unwanted macro expansion. In the following example, macro expansion is 
terminated when the EXITM directive is assembled because the condition X EQ is true. 



5-9 



Chapter 5. Macros 



MAC3 MACRO X,Y 



IF X EQ 
EXITM 



ENDM 



Special Macro Operators 

In certain special cases, the normal rules for dealing with macros do not work. Assume, for example, that you 
want to specify three actual parameters, and the second parameter happens to be the comma character. To the 
assembler, the list PARM1 ,,,PARM3 appears to be a list of four parameters where the second and third param- 
eters are missing. The list can be passed correctly by enclosing the comma in angle brackets: PARM1 ,<,>,PARM3. 
These special operators instruct the assembler to accept the enclosed character (the comma) as an actual param- 
eter rather than a delimiter. 

The assembler recognizes a number of operators that allow special operations: 

& Ampersand. Used to concatenate (link) text and dummy parameters. See the further 

discussion of ampersands below. 

<> Angle brackets. Used to delimit text, such as lists, that contain other delimiters. 

Notice that blanks are usually treated as delimiters. Therefore, when an actual 
parameter contains blanks (passing the instruction MOV A,M, for example) the 
parameter must be enclosed in angle brackets. This is also true for any other de- 
limiter that is to be passed as part of an actual parameter. To pass such text to 
nested macro calls, use one set of angle brackets for each level of nesting. (See 
'Nested Macro Definitions,' below.) 

;; Double semicolon. Used before a comment in a macro definition to prevent 

inclusion of the comment in expansions of the macro and reduce storage 
requirements. The comment still appears in the listing of the definition. 

! Exclamation point (escape character). Placed before a character (usually a 

delimiter) to be passed as literalized text in an actual parameter. Used primarily 
to pass angle brackets as part of an actual parameter. To pass a literalized 
exclamation point, issue !!. Carriage returns cannot be passed as actual parameters. 

The '!' is always preserved while building an actual parameter. It is not 
echoed when an actual parameter is substituted for a dummy parameter, 
except when the substitution is being used to build another actual parameter. 



5-10 



Chapter 5. Macros 



NUL In certain cases it is not necessary to pass a parameter to a macro. It is 

necessary, however, to indicate the omission of the parameter. The omitted 
(or null) parameter can be represented by two consecutive delimiters as in 
the list PARM1,,PARM3. A null parameter can also be represented by two 
consecutive single quotes: ",PARM2,PARM3. Notice that a null is quite 
different from a blank: a blank is an ASCII character with the hexadecimal 
representation 20H; a null has no character representation. In the assembly 
listing a null looks the same as a blank, but that is only because no substi- 
tution has taken place. The programmer must decide the meaning of a null 
parameter. Although the mechanism is somewhat different, the defaults taken 
for assembler controls provide a good example of what a null parameter can 
mean. For example, coding MOD85 as an assembler control specifies that 
the assembler is to generate object code for the 8085. The absence of this 
control (which in effect is a null parameter) specifies that the assembler 
is to generate only 8080 object code. 

Assembler controls are explained in the ISIS-II 8080/8085 Macro Assembler 
Operator's Manual, 9800292. 

Example 

In a macro with the dummy parameters W,X,Y,Z it is acceptable for either 
the X or Y parameter to be null, but not both. The following IF directive 
tests for the error condition: 

IF NUL X&Y 
EXITM 

When a macro is expanded, any ampersand preceding or following a dummy parameter in a macro definition is 
removed and the substitution of the actual parameter occurs at that point. When it is not adjacent to a dummy 
parameter, the ampersand is not removed and is passed as part of the macro expansion text. 

NOTE 

The ampersand must be immediately adjacent to the text being 
concatenated; intervening blanks are not allowed. 

If nested macro definitions (described below) contain ampersands, the only ampersands removed are those adjacent 
to dummy parameters belonging to the macro definition currently being expanded. All ampersands must be re- 
moved by the time the expansion of the encompassing macro body is performed. Exceptions force illegal character 
errors. 

Ampersands placed inside strings are recognized as concatenation delimiters when adjacent to dummy parameters; 
similarly, dummy parameters within character strings are recognized only when they are adjacent to ampersands. 
Ampersands are not recognized as operators in comments. 



5-11 



< lidpter 5. Macros 



Nested Macro Definitions 

A macro definition can be contained completely within the. body of another macro definition (that is, macro 
definitions can be nested). The body of a macro consists of all text (including nested macro definitions) 
bounded by matching MACRO and ENDM directives. The assembler allows any number of macro definitions to 
be nested. 

When a higher-level macro is called for expansion, the next lower-level macro is defined and eligible to be called 
for expansion. A lower-level macro cannot be called unless all higher-level macro definitions have already been 
called and expanded. 

\ new macro may be defined or an existmg macro redefined by a nested macro definition depending on whether 
the name of the nested macro is a new label or has previously been established as a dummy parameter in a 
higher-level macro definition. Therefore, each lime a higher-level macro is called, a lower-level definition can be 
tlcMned differently if the two contain common dummy parameters. Such redefinition can be costly, however, in 
leiins ot assembler execution speed. 

Since IRP, IRPC, and REPT blocks constitute macro definitions, they also can be nested within another definition 
created by IRP, IRPC, REPT, or MACRO directives. In addition, an element in an IRP or IRPC actual parameter 
list (enclosed in angle brackets) may itself be a list of bracketed parameters; that is, lists of parameters can contain 
elements that are also lists. 

Example: 

LISTS MACRO PARAMl ,PARAM2 



ENDM 



LISTS <A, <B,C» 



MACRO CALLS 



Once a macro has been defined, it can be called any number of times in the program. The call consists of the 
macro name and any actual parameters that are to replace dummy parameters during macro expansion. During 
assembly, each macro call is replaced by the macro definition code; dummy parameters are replaced by actual 
parameters. 



Macro Call Format 



Label Opcode Operand 

optional: macro name optional actual 

parameler(s) 



5-12 



Chapter 5. Macros 



The assembler must encounter the macro definition before the first call for that macro. Otherwise, the macro 
call is assumed to be an illegal opcode. The assembler inserts the macro body identified by the macro name 
each time it encounters a call to a previously defined macro in your program. 

The positioning of actual parameters in a macro call is critical since the substitution of parameters is based 
solely on position. The first-listed actual parameter replaces each occurrence of the first-listed dummy param- 
eter; the second actual parameter replaces the second dummy parameter, and so on. When coding a macro call, 
you must be certain to list actual parameters in the appropriate sequence for the macro. 

Notice that blanks are usually treated as delimiters. Therefore, when an actual parameter contains blanks 
(passing the instruction MOV A,M, for example) the parameter must be enclosed in angle brackets. This is also 
true for any other delimiter that is to be passed as part of an actual parameter. Carriage returns cannot be passed 
as actual parameters. 

If a macro call specifies more actual parameters than are listed in the macro definition, the extra parameters 
are ignored. If fewer parameters appear in the call than in the definition, a null replaces each missing parameter. 

Example: 

The following example shows two calls for the macro LOAD. LOAD is defined as follows: 

LOAD 

MOVES: 



MACRO 


G1,G2,G3 


LOCAL 


MOVES 


LHLD 


G1 


MOV 


A,M 


LHLD 


G2 


MOV 


B,M 


LHLD 


G3 


MOV 


C,M 


ENDM 





LOAD simply loads the accumulator with a byte of data from the location specified by the first actual parameter, 
the B register with a byte from the second parameter, and the C register with a byte from the third parameter. 

The first time LOAD is called, it is used as part of a routine that inverts the order of three bytes in memory. 
The second time LOAD is called, it is part of a routine that adds the contents of the B register to the accumu- 
lator and then compares the result with the contents of the C register. 



5-13 



Chapter 5. Macros 



MAIN PROGRAM 



SUBSTITUTION 



JNZ NEXT 


LOAD 


FLD,FLD+l,FLD+2 


MOV 


M,A ;1NVERT BYTES 


DCX 


H 


MOV 


M,B 


DCX 


H 


MOV 


M,G 


LOAD 


3E0H,BYTE,CHECK 


ADD 


B ;CHECK DIGIT 


CMP 


C 


CNZ 


DGTBAD 



??0001 : 



??0002: 



JNZ 


NEXT 


LHLD 


FLD 


MOV 


A,M 


LHLD 


FLD+1 


MOV 


B,M 


LHLD 


FLD+2 


MOV 


C,M 


MOV 


M,A ;INVERT BYTE 


DCX 


H 


MOV 


M,B 


DCX 


H 


MOV 


M,C 


LHLD 


3E0H 


MOV 


A,M 


LHLD 


BYTE 


MOV 


B,M 


LHLD 


CHECK 


MOV 


C,M 


ADD 


B ;CHECK DIGIT 


CMP 


C 


CNZ 


DGTBAD 



Nested Macro Calls 

Macro calls (including any combination of nested IRP, IRPC, and REPT constructs) can be nested within macro 
definitions up to eight levels. The macro being called need not be defined when the enclosing macro is defined; 
however, it must be defined before the enclosing macro is called. 

A macro definition can also contain nested calls to itself (recursive macro calls) up to eight levels, as long as the 
recursive macro expansions can be terminated eventually. This operation can be controlled using the conditional 
assembly directives described in Chapter 4 (IF, ELSE, ENDIF). 

Example: 

Have a macro call itself five times after it is called from elsewhere in the program. 

PARAMl SET 5 

RECALL MACRO 



IF PARAMl NE 

PARAMl SET PARAMI-1 

RECALL 
ENDIF 



;RECURS1VE CALL 



ENDM 



5-14 



Chapter S. Macros 



Macro Expansion 

When a macro is called, the actual parameters to be substituted into the prototype code can be passed in one of 
two modes. Normally, the substitution of actual parameters for dummy parameters is simply a text substitution. 
The parameters are not evaluated until the macro is expanded. 

If a percent sign (%) precedes the actual parameter in the macro call, however, the parameter is evaluated 
immediately, before expansion occurs, and is passed as a decimal number representing the value of the param- 
eter. In the case of IRPC, a '%' preceding the actual parameter causes the entire text string to be treated as a 
single parameter. One IRPC iteration occurs for each digit in the decimal string passed as the result of immediate 
evaluation of the text string. 

The normal mechanism for passing actual parameters is adequate for most applications. Using the percent sign 
to pre-evaluate parameters is necessary only when the value of the parameter is different within the local con- 
text of the macro definition as compared to its global value outside the macro definition. 

Example: 

The macro shown in this example generates a number of rotate instructions. The parameters passed in the macro 
call determine the number of positions the accumulator is to be rotated and whether rotate right or rotate left 
instructions are to be generated. Some typical calls for this macro are as follows: 

SHIFTR 'R',3 

SHIFTR L,%C0UNT~1 

The second call shows an expression used as a parameter. This expression is to be evaluated immediately rather 
than passed simply as text. 

The definition of the SHIFTR macro is shown below. This macro uses the conditional IF directive to test the 
validity of the first parameter. Also, the REFT macro directive is nested within the SHIFTR macro. 

SHIFTR MACRO X,Y 

IF X EO 'R' 
REPT Y 
RAR 
ENDM 
ENDIF 
IF X NE 'L' 

EXITM 
ELSE 
REPT Y 
RAL 
ENDM 
ENDIF 
ENDM 

The indentation shown in the definition of the SHIFTR macro graphically illustrates the relationships of the IF, 
ELSE, ENDIF directives and the REPT, ENDM directives. Such indentation is not required in your program, but 
may be desirable as documentation. 

5-15 



Chapter S. Macros 



The SHIFTR macro generates nothing if the first parameter is neither R nor L. Therefore, the following calls 
produce no code. The result in the object program is as though the SHIFTR macro does not appear in the 
source program. 

SHIFTR 5 

SHIFTR 'B',2 

The following call to the SHIFTR macro generates three RAR instructions: 

SHIFTR 'R',3 

Assume that a SET directive elsewhere in the source program has given COUNT the value 6. The following call 
generates five RAL instructions; 

SHIFTR 'L',%C0UNT~1 

The following is a redefinition of the SHIFTR macro. In this definition, notice that concatenation is used to 
form the RAR or RAL operation code. If a call to the SHIFTR macro specifies a character other than R or L, 
illegal operation codes are generated. The assembler flags all illegal operation codes as errors. 

SHIFTR 



MACRO 


X,Y 


REPT 


Y 


RA&X 




ENDM 




ENDM 





NULL MACROS 



A macro may legally comprise only the MACRO and ENDM directives. Thus, the following is a legal macro 
definition: 

NADA MACRO P1,P2,P3,P4 

ENDM 

A call to this macro produces no source code and therefore has no effect on the program. 

Although there is no reason to write such a macro, the null (or empty) macro body has a practical application. 
For example, all the macro prototype instructions might be enclosed with IF-ENDIF conditional directives. 
When none of the specified conditions is satisfied, all that remains of the macro is the MACRO directive and 
the ENDM directive. 



SAMPLE MACROS 

The following sample macros further demonstrate the use of macro directives and operators. 



5-16 



Chapter 5. Macros 



Example 1: Nested IRPC 

The following macro definition contains a nested IRPC directive. Notice that the third operand of the outer 
macro becomes the character string for the IRPC: 

MOVE MACRO X,Y,Z 

IRPC PARAM.Z 

LHLD X&&PARAM 

SHLD Y&&PARAM 
ENDM 
ENDM 

Assume that the program contains the call MOVE SRC,DST,123. The third parameter of this call is passed to 
the IRPC. This has the same effect as coding IRPC PARAM,123. When expanded, the MOVE macro generates 
the following source code: 

LHLD SRC1 

SHLD DST1 

LHLD SRC2 

SHLD DST2 

LHLD SRC3 

SHLD DST3 

Notice the use of concatenation to form labels in this example. 

Example 2: Nested Macros Used to Generate DB Directives 

This example generates a number of DB directives, each with its own label. Two macros are used for this 
purpose: INC and BLOCK. The INC macro is defined as follows: 



INC MACRO 

$ SAVE GEN 

F1&F2: DB 

$ RESTORE 

ENDM 



F1,F2 

;GENERATE LABELS & DB's 



The BLOCK macro, which accepts the number of DB's to be generated (NUMB) and a label prefix (PREFIX), is 
defined as follows: 



BLOCK MACRO 

SAVE NOGEN 
COUNT SET 

REPT 
COUNT SET 

INC 

ENDM 
RESTORE 

ENDM 



NUMB,PREFIX 



NUMB 

COUNT+1 

PREFIX,%COUNT ;NESTED MACRO CALL 



5-17 



Chapter S. Macros 



The macro call BLOCK 3, LAB generates the following source code: 





BLOCK 


3,LAB 


LABI: 


DB 





LAB2: 


DB 





LAB3: 


DB 






The assembler controls specified in these two macros (the lines beginning with $) are used to clean up the 
assembly listing for easier reading. The source code shown for the call BLOCK 3, LAB is what appears in the 
assembly listing when the controls are used. Without the controls, the assembly listing appears as follows: 





BLOCK 


3,LAB 


COUNT 


SET 







REPT 


3 


COUNT 


SET 


COUNT+1 




INC 


LAB,%COUNT 




ENDM 




COUNT 


SET 


COUNT+1 




INC 


LAB,%COUNT 


LABI: 


DB 





COUNT 


SET 


COUNT+1 




INC 


LAB,%COUNT 


LAB2: 


DB 





COUNT 


SET 


COUNT+1 




INC 


LAB,%COUNT 


LAB3: 


DB 






Example 3: A Macro that Converts Itself into a Subroutine 

In some cases, the in-line coding substituted for each macro call imposes an unacceptable memory requirement. 
The next three examples show three different methods for converting a macro call into a subroutine call. The 
first time the SBMAC macro is called, it generates a full in-line substitution which defines the SUBR subroutine. 
Each subsequent call to the SBMAC macro generates only a CALL instruction to the SUBR subroutine. 

Within the following examples, notice that the label SUBR must be global so that it can be called from outside 
the first expansion. This is possible only when that part of the macro definition containing the global label is 
called only once in the entire program. 

Method #1 : Nested Macro Definitions 

Macros can be redefined during the course of a program. In the following example, the definition of SBMAC 
contains its own redefinition as a nested macro. The first lime SBMAC is called, it is full expanded, and the 
redefinition of SBMAC replaces the original definition. The second time SBMAC is called, only its redefinition 
(a CALL instruction) is expanded. 



5-18 



Chapter S. Macros 



SBMAC 


MACRO 




SBMAC 


MACRO 






CALL 


SUBR 




ENDM 






CALL 


SUBR 


LINK: 


IMP 


DUN 


SUBR: 


RET 




DUN: 


ENDM 





SUBR ;;REDEFIN1TI0N OF SBMAC 



Notice that both versions of SBMAC contain CALL SUBR instructions. This is necessary to provide a return 
address at the end of the SUBR routine. The jump instruction labelled LINK is required to prevent the SUBR 
subroutine from executing a return to itself. Notice that the return address for the second CALL SUBR 
instruction would be SUBR if the jump instruction were omitted. The |MP DUN instruction simply transfers 
control past the end of the subroutine. 

NOTE 

The assembler allows the use of a source line consisting 
only of a label. Such a label is assigned to the next source 
line for which code or data is generated. Notice that 
neither code nor data is generated for an ENDM directive, 
so the label DUN is assigned to whatever instruction follows 
the ENDM directive. This construct is required because the 
ENDM directive itself may not be given a label. 

Method #2: Conditional Assembly 

The second method for altering the expansion of the SBMAC macro uses conditional assembly. In this example, 
a switch (FIRST) is set TRUE just before the first call for SBMAC. SBMAC is defined as follows: 



TRUE 


EQU 


OFFH 


FALSE 


EQU 





FIRST 


SET 


TRUE 


SBMAC 


MACRO 
CALL SUBR 






IF 


FIRST 


FIRST 


SET 


FALSE 


LINK: 


IMP 


DUN 


SUBR: 







DUN: 



RET 

ENDIF 
ENDM 



5-19 



Chapter 5. Macros 



The first call to SBMAC expands the full definition, including the call to and definition of SUBR: 





SBMAC 






CALL 


SUBR 




IF 


FIRST 


LINK: 


JMP 


DUN 


SUBR: 







DUN: 



RET 
ENDIF 



Because FIRST is TRUE when encountered during the first expansion of SBMAC, all the statements between 
IF and ENDIF are assembled into the program. In subsequent calls, the conditionally-assembled code is skipped 
so that the subroutine is not regenerated. Only the following expansion is produced: 



SBMAC 




CALL 


SUBR 


IF 


FIRST 



Method #3: Conditional Ass.embly with EXITM 

The third method for altering the expansion of SBMAC also uses conditional assembly, but uses the EXITM 
directive to suppress unwanted macro expansion after the first call. EXITM is effective when FIRST is FALSE, 
which it is after the first call to SBMAC. 



TRUE 


EQU 


OFFH 


FALSE 


EQU 





FIRST 


SET 


TRUE 


SBMAC 


MACRO 






CALL 


SUBR 




IF 


NOT FIRST 




EXITM 






ENDIF 




FIRST 


SET 


FALSE 




IMP 


DUN 


SUBR: 







DUN: 



RET 
ENDM 



5-20 



Chapter S. Macros 



Example 4: Computed GOTO Macro 

This sample macro presents an implementation of a computed GOTO for the 8080 or 8085. The computed 
GOTO, a common feature of many high level languages, allows the program to jump to one of a number of 
different locations depending on the value of a variable. For example, if the variable has the value zero, the 
program jumps to the first item in the list; if the variable has the value 3, the program jumps to the fourth 
address in the list. 

In this example, the variable is placed in the accumulator. The list of addresses is defined as a series of DW 
directives starting at the symbolic address TABLE. This macro (TjUMP) also modifies itself with a nested 
definition. Therefore, only the first call to the TJUMP macro generates the calculated GOTO routine. Subse- 
quent calls produce only the jump instruction jMP TjCODE. 



TjUMP 


MACRO 




TJCODE. 


ADD 


A ; 




MVI 


D,0 ; 




MOV 


E,A ; 




DAD 


D i 




MOV 


E,M ; 




INX 


H 




MOV 


D,M 




XCHG 






PCHL 




TJUMP 


MACRO 






JMP 


TJCODE ; 




ENDM 






ENDM 





JUMP TO A-TH ADDR IN TABLE 

MULTIPLY A BY 2 

CLEAR D REG 

;GET TABLE OFFSET INTO D&E 

ADD OFFSET TO TABLE ADDR IN H&L 

GET 1ST ADDRESS BYTE 

.-GET 2ND ADDRESS BYTE 

JUMP TO ADDRESS 

REDEFINE TJUMP TO SAVE CODE 

NEXT CALL JUMPS TO ABOVE CODE 



Notice that the definition of the TJUMP ^: does not account for loading the address of the address t 'Me 

into the H and L registers; the user must load this address just before calling the TJUMP macro. The following 
shows the coding for the address table (TABLE) and a typical call sequence for the TJUMP macro: 



MVI 


A,2 


LXI 


H.TABLE 


TJUMP 





TABLE: 



DW 


LOCO 


DW 


LOCI 


DW 


L0C2 



The call sequence shown above causes a jump to L0C2. 



5-21 



Chapter 5. Macros 



Example 5: Using IRP to Define the Jump Table 

The TJUMP macro becomes even more useful when a second macro (GOTO) is used to define the jump table, 
load the address of the table into the H and L registers, and then call TJUMP. The GOTO macro is defined as 
follows: 



GOTO 



jTABLE: 



MACRO 


INDEX, LIST 


LOCAL 


JTABLE 


LDA 


INDEX 


LXI 


H,JTABLE 


TJUMP 




IRP 


FORMAL,<L 


DW 


FORMAL 


ENDM 




ENDM 





LOAD ACCUM WITH INDEX 

LOAD H&L WITH TABLE ADDRESS 

CALL TJUMP MACRO 

;SET UP TABLE 



A typical call to the GOTO macro would be as follows: 

GOTO CASE,<COUNT,TIMER,DATE,PTDRVR> 

This call to the GOTO macro builds a table of DW directives for the labels COUNT, TIMER, DATE, and 
PTDRVR. It then loads the base address of the table into the H and L registers and calls the TJUMP macro. 
If the value of the variable CASE is 2 when the GOTO macro is called, the GOTO and TJUMP macros 
together cause a jump to the address of the DATE routine. 

Notice that any number of addresses may be specified in the list for the GOTO routine as long as they all fit 
on a single source line. Also, the GOTO macro may be called any number of times, but only one copy of the 
coding for the TJUMP is generated since the TJUMP macro redefines itself to generate only a JMP TJCODE 
instruction. 



5-22 



6. PROGRAMMING TECHNIQUES 



This chapter describes some techniques that may be of help to the programmer. 



BRANCH TABLES PSEUDO-SUBROUTINE 

Suppose a program consists of several separate routines, any of which may be executed depending upon some 
initial condition (such as a number passed in a register). One way to code this would be to check each condition 
sequentially and branch to the routines accordingly as follows: 

CONDITION = CONDITION 1? 
IF YES BRANCH TO ROUTINE 1 
CONDITION = CONDITION 2? 
IF YES BRANCH TO ROUTINE 2 



BRANCH TO ROUTINE N 

A sequence as above is inefficient, and can be improved by using a branch table. 

The logic at the beginning of the branch table program loads the starting address of the branch table into the H 
and L registers. The branch table itself consists of a list of starting addresses for the routines to be branched to. 
Using the H and L registers as a pointer, the branch table program loads the selected routine's starting address 
into the program counter, thus effecting a jump to the desired routine. For example, consider a program that 
executes one of eight routines depending on which bit of the accumulator is set: 



)ump to routine 1 if the accumulator holds 00000001 



2 ' 

3 • 

4 ' 

5 ' 

6 ' 

7 ' 



00000010 
00000100 
00001000 
00010000 
00100000 
01000000 
10000000 



A program that provides such logic follows. The program is termed a 'pseudo-subroutine' because it is treated as a 
subroutine by the programmer (i.e., it appears just once in memory), but is entered via a regular JUMP instruction 
rather than via a CALL instruction. 



6-1 



Chapter 6. Programming Techniques 



Main Program 




Branch Table 
Program 



Jump 
Routines 




normal subroutine return 
sequence not followed by 
branch table program 



6-2 



Chapter 6. Programming Techniques 



Label 


Code 


Operand 


START: 


LXI 


H.BTBL 


GTBIT: 


RAR 






]C 


GETAD 




INX 


H 




INX 


H 




IMP 


GTBIT 


GETAD: 


MOV 


E,M 




INX 


H 




MOV 


D,M 




XCHG 





PCHL 



jREGISTERS H AND L WILL 
iPOINT TO BRANCH TABLE 



(H,L)=(H,L)+2 TO 

POINT TO NEXT ADDRESS 

IN BRANCH TABLE 

BIT FOUND 

LOAD JUMP ADDRESS 

INTO D AND E REGISTERS 

EXCHANGE D AND E 
WITH H AND L 

UMPTO ROUTINE 
ADDRESS 



BTBL: 



DW 


ROUTl 


DW 


ROUT 2 


DW 


R0UT3 


DW 


R0UT4 


DW 


ROUTS 


DW 


R0UT6 


DW 


R0UT7 


DW 


ROUTS 



BRANCH TABLE. EACH 

ENTRY IS A TWO-BYTE 

ADDRESS 

HELD LEAST SIGNIFICANT 

BYTE FIRST 



The control routine at START uses the H and L registers as a pointer into the branch table (BTBL) corresponding 
to the bit of the accumulator that is set. The routine at GETAD then transfers the address held in the corres- 
ponding branch table entry to the H and L registers via the D and E registers, and then uses a PCHL instruction, 
thus transferring control to the selected routine. 



TRANSFERRING DATA TO SUBROUTINES 

A subroutine typically requires data to perform its operations. In the simplest case, this data may be transferred 
in one or more registers. 

Sometimes it is more convenient and economical to let the subroutine load its own registers. One way to do this 
is to place a list of the required data (called a parameter list) in some data area of memory, and pass the address 
of this list to the subroutine in the H and L registers. 



6-3 



Chapter 6. Programming Techniques 



For example, the subroutine ADSUB expects the address of a three-byte parameter list in the H and L registers. 
It adds the first and second bytes of the list, and stores the result in the third byte of the list: 



Label 



Code 



Operand Comment 



LXI 



CALL 



H.PLIST 



ADSUB 



LOAD H AND L WITH 
ADDRESSES OF THE PARAM- 
ETER LIST 
CALL THE SUBROUTINE 



RETT: 



PLIST: 


DB 


6 




DB 


8 




DS 


1 




LXI 


H,LIST2 




CALL 


ADSUB 


RET2: 






LIST2: 


DB 


10 




DB 


35 




DS 


1 


DSUB: 


MOV 


A,M 




INX 


H 




MOV 


B,M 




ADD 


B 




INX 


H 




MOV 


M,A 




RET 





FIRST NUMBER TO BE ADDED 

SECOND NUMBER TO BE 

ADDED 

RESULT WILL BE STORED HERE 

LOAD H AND L REGISTERS 

FOR ANOTHER CALL TO ADSUB 



GET FIRST PARAMETER 

INCREMENT MEMORY 

ADDRESS 

GET SECOND PARAMETER 

ADD FIRST TO SECOND 

INCREMENT MEMORY 

ADDRESS 

STORE RESULT AT THIRD 

PARAMETER STORE 

RETURN UNCONDITIONALLY 



The first time ADSUB is called, it loads the A and B registers from PLIST and PLIST+1 respectively, adds them, 
and stores the result in PLIST+2. Return is then made to the instruction at RETT. 



6-4 



Chapter 6. Programming Techniques 



First call to ADSUB: 



ADSUB: 



H L 



06 



08 



OEH 



PL I ST 



PLIST+1 



PLIST+2 



The second time ADSUB is called, the H and L registers point to the parameter list LiST2. The A and B 
registers are loaded with 10 and 35 respectively, and the sum is stored at LIST2+2. Return is then made to 
the instruction at RET2. 

Note that the parameter lists PLIST and LIST2 could appear anywhere in memory without altering the results 
produced by ADSUB. 

This approach does have its limitations, however. As coded, ADSUB must receive a list of two and only two 
numbers to be added, and they must be contiguous in memory. Suppose we wanted a subroutine (GENAD) 
which would add an arbitrary number of bytes, located anywhere in memory, and leave the sum in the accumu- 
lator. 

This can be done by passing the subroutine a parameter list which is a list of addresses of parameters, rather 
than the parameters themselves, and signifying the end of the parameter list be a number whose first byte is 
FFH (assuming that no parameters will be stored above address FFOOH). 

Call to GENAD: 



GENAD: 







y ' 


i 


8 
16 
13 
82 


PARM1 






L— 


ADRl 


PARM4 




ADR2 






ADR3 


PARM3 




ADR4 






FFFF 


PARM2 



As implemented below, GENAD saves the current sum (beginning with zero) in the C register. It then loads the 
address of the first parameter into the D and E registers. If this address is greater than or equal to FFOOH, it 
reloads the accumulator with the sum held in the C register and returns to the calling routine. Otherwise, it 



6-5 



Chapter 6. Programming Techniques 



loads the parameter into the accumulator and adds the sum in the C register to the accumulator. The routine 
then loops back to pick up the remaining parameters. 



Label 



Code 



Operand Comment 





LXI 


H.PLIST 


;LOAD ADDRE 




CALL 


GENAD 


;PARAMETER / 




HALT 






PLIST: 


DW 


PARM1 


jLIST OF PARA 




DW 


PARM2 






DW 


PARM3 






DW 


PARM4 






DW 


OFFFFH 


;TERMINATOR 


PARM1: 


DB 


6 




PARM4: 


DB 


16 





PARM3: 



PARM2: 



GENAD: 
LOOP: 



BACK: 



DB 



DB 



13 



82 



XRA 


A 


MOV 


C,A 


MOV 


E,M 


INX 


H 


MOV 


A,M 


CPI 


OFFH 


JZ 


BACK 


MOV 


D,A 


LDAX 


D 


ADD 


C 


INX 


H 


jMP 


LOOP 


MOV 


A,C 


RET 




END 





iclear accumulator 
save current total in c 
get low order address byte 
pf first parameter 

get high order address byte 

of first parameter 

compare to ffh 

if equal, routine is complete 

d and e now address parameter 

load accumulator with parameter 

add previous total 

increment h and l to point 

to next parameter address 

;Ge;t next parameter 

routine done - restore total 

return to calling routine 



6^ 



DW 


PARM4 


DW 


PARM1 


DW 


OFFFFH 



Chapter 6. Programming Techniques 

Note that GENAD could add any combination of the parameters with no change to the parameters themselves. 

The sequence: 

LXI H.PLIST 

CALL GENAD 



PLIST: 



would cause PARM1 and PARM4 to be added, no matter where in memory they might be located (excluding 
addresses above FFOOH). 

Many variations of parameter passing are possible. For example, if ii is necessary to allow parameters to be 
stored at any address, a calling program can pass the total number of parameters as the first parameter; the 
subroutine then loads this first parameter into a register and uses it as a counter to determine when all param- 
eters had been accepted. 



SOFTWARE MULTIPLY AND DIVIDE 

The multiplication of two unsigned 8-bit data bytes may be accomplished by one of two techniques: repetitive 
addition, or use of a register shifting operation. 

Repetitive addition provides the simplest, but slowest, form of multiplication. For example, 2AH*74H may be 
generated by adding 74H to the (initially zeroed) accumulator 2AH times. 

Shift operations provide faster multiplication. Shifting a byte left one bit is equivalent to multiplying by 2, and 
shifting a byte right one bit is equivalent to dividing by 2. The following process will produce the correct 2-byte 
result of multiplying a one byte multiplicand by a one byte multiplier: 

A. Test the least significant bit of multiplier. If zero, go to step b. If one, add the 
multiplicand to the most significant byte of the result. 

B. Shift the entire two-byte result right one bit position. 

C. Repeat steps a and b until all 8 bits of the multiplier have been tested. 
For example, consider the multiplication: 2AH*3CH==9D8H 

Step 1 : Test multiplier 0-bit; it is 0, so shift 16-bit result right one bit. 

Step 2: Test multiplier 1-bit; it is 0, so shift >6-bit result right one bit. 

Step 3: Test multiplier 2-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit 
result right one bit. 



6-7 



Chapter 6. Programming Techniques 



Step 4: Test multiplier 3-bit; it is 1 , so add 2AH to high-order byte of result and shift 16-bit 
result right one bit. 

Step 5: Test multiplier 4-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit 
result right one bit. 

Step 6: Test multiplier 5-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit 
result right one bit. 

Step 7: Test multiplier 6-bit; it is 0, so shift 16-bit result right one bit. 

Step 8: Test multiplier 7-bit; it is 0, so shift 16-bit result right one bit. 

The result produced is 09D8. 



HIGH ORDER BYTE 

MULTIPLIER MULTIPLICAND OF RESULT 

Start 00111100(3C) 001 01 01 0(2 A) 00000000 

Step la 

b 00000000 

Step 2 a 

b 00000000 

Step 3 a 00101010 

b 00010101 

Step 4 a 001 1 1 1 1 1 

b 0001 1111 

Step 5 a 01001001 

b 00100100 

Step 6 a 01001110 

b 00100111 

Step 7 a 

b 00010011 

Step 8 a 

b 00001001 



LOW-ORDER BYTE 
OF RESULT 
00000000 

00000000 

00000000 
00000000 
00000000 
00000000 
10000000 
10000000 
11000000 
11000000 
01100000 

10110000 

11011000(908) 



Since the multiplication routine described above uses a number of important programming techniques, a sample 
program is given v^ith comments. 

The program uses the B register to hold the most significant byte of the result, and the C register to hold the 
least significant byte of the result. The 16-bit right shift of the result is performed in the accumulator by two 
rotate-right-through-carry instructions. 



6-8 



Chapter 6. Programming Techniques 



Zero carry and then rotate B: 
B 




Then rotate C to complete the shift: 
B 



Register D holds the multiplicand, and register C originally holds the multiplier. 



MULT; 



MULTO: 



MVI 



B,0 



MVI 


E,9 


MOV 


A,C 


RAR 




MOV 


C,A 


DCR 


E 


JZ 


DONE 


MOV 


A,B 


]NC 


MULT1 


ADD 


D 



MULT1; 



DONE: 



RAR 

MOV 
JMP 



INITIALIZE MOST SIGNIFICANT BYTE 

;0F RESULT 

BIT COUNTER 

ROTATE LEAST SIGNIFICANT BIT OF 

MULTIPLIER TO CARRY AND SHIFT 

LOW-ORDER BYTE OF RESULT 

;EXIT IF COMPLETE 



ADD MULTIPLICAND TO HIGH- 
ORDER BYTE OF RESULT IF BIT 
WAS A ONE 

;CARRY=0 HERE SHIFT HIGH- 
ORDER BYTE OF RESULT 



B,A 
MULTO 



An analogous procedure is used to divide an unsigned 16-bit number by an unsigned 16-bit number. Here, the 
process involves subtraction rather than addition, and rotate-left instructions instead of rotate-right instructions. 



6-9 



Chapter 6. Programming Techniques 



The following reentrant program uses the B and C registers to hold the dividend and quotient, and the D and E 
register to hold the divisor and remainder. The H and L registers are used to store data temporarily. 



DIV: 



DVO: 



DV1: 



MOV 


A,D 


CMA 




MOV 


D,A 


MOV 


A,E 


CMA 




MOV 


E,A 


INX 


D 


LXl 


H,0 


MVI 


A,17 


PUSH 


H 


DAD 


D 


)NC 


DV1 


XTHL 




POP 


H 


PUSH 


PSW 


MOV 


A,C 


RAL 




MOV 


C,A 


MOV 


A,B 


RAL 




MOV 


B,A 


MOV 


A,L 


RAL 




MOV 


L,A 


MOV 


A,H 


RAL 




MOV 


H,A 


POP 


PSW 


DCR 


A 


|NZ 


DVO 



;NEGATE THE DIVISOR 



FOR TWO'S COMPLEMENT 

INITIAL VALUE FOR REMAINDER 

INITIALIZE LOOP COUNTER 

SAVE REMAINDER 

SUBTRACT DIVISOR (ADD NEGATIVE) 

UNDER FLOW, RESTORE HL 



SAVE LOOP COUNTER (A) 
;4 REGISTER LEFT SHIFT 
iWITH CARRY 
;CY->C >B >L->H 



RESTORE LOOP COUNTER (A) 
DECREMENT IT 
KEEP LOOPING 



POST-DIVIDE CLEAN UP 

SHIFT REMAINDER RIGHT AND RETURN IN DE 



ORA 


A 


MOV 


A,H 


RAR 




MOV 


D,A 


MOV 


A,L 


RAR 




MOV 


E,A 


RET 




END 





610 



Chapter 6. Programming Techniques 



MULTIBYTE ADDITION AND SUBTRACTION 

The carry flag and the ADC (add with carry) instructions may be used to add unsigned data quantities of 
arbitrary length. Consider the following addition of two three-byte unsigned hexadecimal numbers: 

32AF8A 
+84BA90 



B76A1A 



To perform this addition, add to the low-order byte using an ADD instruction. ADD sets the carry flag for use 
in subsequent instructions, but does not include the carry flag in the addition. Then use ADC to add to all 
higher order bytes. 



n 

32 

84 

B7 



carry = 1 



n 

AF 
BA 

6A 



carry = 1 • 



8A 
90_ 

•1A 



The following routine will perform this multibyte addition, making these assumptions: 

The E register holds the length of each number to be added (in this case, 3). 

The numbers to be added are stored from low-order byte to high-order byte beginning at memory locations 
FIRST and SECND, respectively. 

The result will be stored from low-order byte to high-order byte beginning at memory location FIRST, replacing 
the original contents of these locations. 



SECND 



SECND+1 



SECND+2 



MEMORY 
LOCATION 


before 


FIRST 


8A 


FIRST^-l 


AF 


FIRSTt2 


32 



90 



BA 



84 



after 






1A 



6A 



B7 



90 



BA 



84 



carry 
carry 



6-11 



Chapter 6. Programming Techniques 



The following routine uses an ADC instruction to add the low-order bytes of the operands. This could cause 
the result to be high by one if the carry flag were left set by some previous instruction. This routine avoids 
the problem by clearing the carry flag with the XRA instruction just before LOOP. 



Label 


Code 


Operand 


Comment 


MADD: 


LXI 


B, FIRST 


B AND C ADDRESS FIRST 




LXI 


H,SECND 


H AND L ADDRESS SECNC 




XRA 


A 


CLEAR CARRY FLAG 


LOOP: 


LDAX 


B 


LOAD BYTE OF FIRST 




ADC 


M 


ADD BYTE OF SECND 
WITH CARRY 




STAX 


B 


STORE RESULT AT FIRST 




DCR 


E 


DONE IF E = 




JZ 


DONE 






INX 


B 


POINT TO NEXT BYTE OF 
FIRST 




INX 


H 


POINT TO NEXT BYTE OF 
SECND 




JMP 


LOOP 


ADD NEXT TWO BYTES 



DONE: 



FIRST: 



SECND: 



DB 


90H 


DB 


OBAH 


DB 


84 H 


DB 


8AH 


DB 


OAFH 


DB 


32H 



Since none of the instructions in the program loop affect the carry flag except ADC, the addition with carry will 
proceed correctly. 

When location DONE is reached, bytes FIRST through FIRST+2 will contain 1A6AB7, which is the sum shown 
at the beginning of this section arranged from low-order to high-order byte. 

In order to create a multibytc subtraction routine, it is necessary only to duplicate the multibyte addition routine 
of this section, changing the ADC instruction to an SBB instruction. The program will then subtract the number 
beginning at SECND from the number beginning at FIRST, placing the result at FIRST. 



DECIMAL ADDITION 

Any 4-bit data quantity may be treated as a decimal number as long as it represents one of the decimal digits 
from through 9, and does not contain any of the bit patterns representing the hexadecimal digits A through F. 
In order to preserve this decimal interpretation when performing addition, the value 6 must be added to the 
4-bit quantity whenever the addition produces a result between 10 and 15. This is because each 4-bit data 
quantity can hold 6 more combinations of bits than there are decimal digits. 



6-12 



Chapter 6. Programming Techniques 



Decimal addition is performed by letting each 8-bit byte represent two 4-bit decimal digits. The bytes are 
summed in the accumulator in standard fashion, and the DAA (decimal adjust accumulator) instruction is then 
used to convert the 8-bit binary result to the correct representation of 2 decimal digits. For multibyte strings, 
you must perform the decimal adjust before adding the next higher-order bytes. This is because you need the 
carry flag setting from the DAA instruction for adding the higher-order bytes. 

To perform the decimal addition: 

2985 
+4936 

7921 
the process works as follows: 

1. Clear the Carry and add the two lowest-order digits of each number (remember that each 2 
decimal digits are represented by one byte). 

85 = 100001 01 B 
36 = 00110110B 
carry = 

.0)101110118 

\ 

Carry = Auxiliary Carry = 

The accumulator now contains OBBH. 

2. Perform a DAA operation. Since the rightmost four bits are greater than 9, a 6 is added to the 
accumulator. 

Accumulator = 1011 101 1B 
6 011 O B 

11 000001 B 

Since the leftmost bits are greater than 9, a 6 is added to these bits, thus setting the carry flag. 

Accumulator = 11000001 B 
6 = 0110 B 

^T] 001 00001 B 
Carry flag = 1 
The accumulator now contains 21 H. Store these two digits. 



6-13 



Chapter 6. Programming Techniques 



3. Add the next group of two digits: 



29 = 00101001 B 
49 = 01 001 001 B 

carry = 1 



-olomooiiB 

\ 

Carry =0 Auxiliary Carry = 1 



The accumulator now contains 73H. 

4. Perform a DAA operation. Since the auxiliary carry flag is set, 6 is added to the accumulator. 

Accumulator = 01 11001 IB 
6 0110 B 

^g 01 11 1001 B 

Carry flag = 

Since the leftmost 4 bits are less than 10 and the carry flag is reset, no further action occurs. 

Thus, the correct decimal result 7921 is generated in two bytes. 

A routine which adds decimal numbers, then, is exactly analogous to the multibyte addition routine MADD of 
the last section, and may be produced by inserting the instruction DAA after the ADC M instruction of that 
example. 

[Each iteration of the program loop will add two decimal digits (one byte) of the numbers. 

DECIMAL SUBTRACTION 

Decimal subtraction is considerably more complicated than decimal addition. In general, the process consists of 
generating the tens complement of the subtrahend digit, and then adding the result to the minuend digit. For 
example, to subtract 34 from 56, form the tens complement of 34 (99-34=65+1=66). Then, 56+66=122. By 
truncating off the carry out of the high order digit, we get 22, the correct result. 

The problem of handling borrows arises in multibyte decimal subtractions. When no borrow occurs from a sub- 
tract, you want to use the tens complement of the subtrahend for the next operation. If a borrow does occur, 
you want to use the nines complement of the subtrahend. 

Notice that the meaning of the carry flag is inverted because you are dealing with complemented data. Thus, a 
one bit in the carry flag indicates no borrow; a zero bit in the carry flag indicates a borrow. This inverted carry 
flag setting can be used in an add operation to form either the nines or tens complement of the subtrahend. 



6-14 



Chapter 6. Programming Techniques 

The detailed procedure for subtracting multi-digit decimal numbers is as follows: 

1. Set the carry flag = 1 to indicate no borrow. 

2. Load the accumulator with 99H, representing the number 99 decimal. 

3. Add zero to the accumulator with carry, producing either 99H or 9AH, and resetting the 
carry flag. 

4. Subtract the subtrahend digits from the accumulator, producing either the nines or tens 
complement. 

5. Add the minuend digits to the accumulator. 

6. Use the DAA instruction to make sure the result in the accumulator is in decimal formal, and 
to indicate a borrow in the carry flag if one occurred. 

7. If there are more digits to subtract, go to step 2. Otherwise, stop. 
Example: 

Perform the decimal subtraction: 

4358D 
-1362D 

2996D 

1 . Set carry = 1 . 

2. Load accumulator with 99H. 

3. Add zero with carry to the accumulator, producing 9AH. 

Accumulator = 1 0011 001 B 
= 00000000 B 
Carry = 1 

10011010B = 9AH 

4. Subtract the subtrahend digits 62 from the accumulator. 

Accumulator = 10011 01 OB 
62 = 10011110 B 

HooinoooB 



6-15 



Chapter 6. Programming Techniques 

5. Add the minuend digits 58 to the accumulator. 

Accumulator = 00111000B 
58 = 01011000 B 

rglOOIOOOOB = 90H 

\ 

Carry = Auxiliary Carry - 1 

6. DAA converts accumulator to 96 (since Auxiliary Carry = 1 ) and leaves carry flag = 
indicating that a borrow occurred. 

7. Load accumulator with 99H. 

8. Add zero with carry to accumulator, leaving accumulator = 99H. 

9. Subtract the subtrahend digits 13 from the accumulator. 

Accumulator = 100110018 
13 = 11101101 8 

]] 100001108 

10. Add the minuend digits 43 to the accumulator. 

Accumulator = 100001108 
43 = 01 00001 I B 

.3110010018 =C9H 

\ 

Carry = Auxiliary Carry = 

11. DAA converts accumulator to 29 and sets the carry flag = 1, indicating no borrow occurred. 
Therefore, the result of subtracting 1362 from 4358 is 2996. 

The following subroutine will subtract one 16-digit decimal number from another using the following assumptions: 
The minuend is stored least significant (2) digits first beginning at location MINU. 
The subtrahend is stored least significant (2) digits first beginning at location SBTRA. 
The result will be stored least significant (2) digits first, replacing the minuend. 



6-16 



Chapter 6. Programming Techniques 



Label 
DSUB: 



LOOP: 



Code 

LXI 
LXl 

MVI 



STC 

MVI 

AC! 
SUB 

XCHG 



Operand 

D,MINU 
H,SBTRA 

C,8 



A,99H 



M 



DONE: 



ADD 


M 


DAA 




MOV 


M,A 


XCHG 




DCR 


C 


)Z 


DONE 


INX 


D 


INX 


H 


)MP 


LOOP 


NOP 





Comment 

D AND E ADDRESS MINUEND 
H AND L ADDRESS SUBTRA- 
HEND 

EACH LOOP SUBTRACTS 2 
DIGITS (ONE BYTE), 
THEREFORE PROGRAM WILL 
SUBTRACT 16 DIGITS, 
SET CARRY INDICATING 
NO BORROW 
LOAD ACCUMULATOR 
iWITH 99H. 

ADD ZERO WITH CARRY 
PRODUCE COMPLEMENT 
;0F SUBTRAHEND 
SWITCH D AND E WITH 
H AND L 
ADD MINUEND 
DECIMAL ADJUST 
ACCUMULATOR 
STORE RESULT 
RESWITCH D AND E 
WITH H AND L 
DONE IF C = 

ADDRESS NEXT BYTE 

;0F MINUEND 

ADDRESS NEXT BYTE 

:0F SUBTRAHEND 

GET NEXT 2 DECIMAL DIGITS 



6-17 



7. INTERRUPTS 



INTERRUPT CONCEPTS 

The following is a general description of interrupt handling and applies to both the 8080 and 8085 processors. 
However, the 8085 processor has some additional hardware features for interrupt handling. For more infor- 
mation on these features, see the description of the 8085 processor in Chapter 1 and the descriptions of the 
RIM, SIM, and RST instructions in Chapter 3. 

Often, events occur external to the central processing unit which require immediate action by the CPU. For 
example, suppose a device is sending a string of 80 characters to the CPU, one at a time, at fixed intervals. 
There are two ways to handle such a situation; 

A. A program could be written which accepts the first character, waits until the next character is 
ready (e.g., executes a timeout by incrementing a sufficiently large counter), then accepts the 
next character, and proceeds in this fashion until the entire 80 character string has been received. 

This method is referred to as programmed Input/Output. 

B. The device controller could interrupt the CPU when a character is ready to be input, forcing a 
branch from the executing program to a special interrupt service routine. 



The interrupt sequence may be illustrated as follows: 

INTERRUPT 



Normal 

Program 

Execution 




Interrupt Service 
Routine 



7-1 



Chapter 7. Interrupts 



The 8080 contains a bil named INTE which may be set or reset by the instructions El and Dl described in 
Chapter 3. Whenever INTE is equal to 0, the entire interrupt handling system is disabled, and no interrupts 
will be accepted. 

When the 8080 recognizes an interrupt request from an external device, the following actions occur: 

1. The instruction currently being executed is completed. 

2. The interrupt enable bit, INTE, is reset = 0. 

3. The interrupting device supplies, via hardware, one instruction which the CPU executes. This 
instruction does not appear anywhere in memory, and the programmer has no control over it, 
since it is a function of the interrupting device's controller design. The program counter is not 
incremented before this instruction. 

The instruction supplied by the interrupting device is normally an RST instruction (see Chapter 3), since this 
is an efficient one byte call to one of 8 eight-byte subroutines located in the first 64 words of memory. For 
instance, the device may supply the instruction: 

RST OH 

with each input interrupt. Then the subroutine which processes data transmitted from the device to the CPU 
will be called into execution via an eight-byte instruction sequence at memory locations OOOOH to 0007H. 

A digital input device may supply the instruction: 

RST IH 

Then the subroutine that processes the digital input signals will be called via a sequence of instructions 
occupying memory locations 0008H to OOOFH. 



Device 'a' 
supplies RST OH 



Transfers 
control to 



0000 
0007 



Beginning of 
subroutine for 
device 'a' 



Device 'b' 
supplies RST IH 



Transfers 
control to 





Beginning of 


0008 


\ subroutine for 


000 F 


device 'b' 



7-2 



Chapter 7. Interrupts 



Device 'x' 
supplies RST 7H 



Transfers 
control to 



0038 



003 F 



Beginning of 
subroutine for 
device 'x' 



Note that any of these 8-byte subroutines may in turn call longer subroutines to process the interrupt, if 
necessary. 

Any device may supply an RST instruction (and indeed may supply any one-byte 8080 instruction). 

The following is an example of an Interrupt sequence: 



ARBITRARY 
MEMORY ADDRESS 



INSTRUCTION 



3C0B 


MOV r R ^ ^ 


Interrupt from Device 1 


to ^rnr 


MOV E.A^..^^ 

Instruction 1 
Instruction 2 

PI — r 




0000 


\ 


Device 1 supplies 

RST OH 
Program Counter = 
3C0C pushed onto 
the stack. 

Control transferred to 
to 0000 






♦ 


Stack popped into 
program counter 



Device 1 signals an interrupt as the CPU is executing the instruction at 3C0B. This instruction is completed. 
The program counter remains set to 3C0C, and the instruction RST OH supplied by device 1 is executed. 
Since this is a call to location zero, 3C0C is pushed onto the stack and program control is transferred to 
location OOOOH. (This subroutine may perform jumps, calls, or any other operation.) When the RETURN is 
executed, address 3C0C is popped off the stack and replaces the contents of the program counter, causing 
execution to continue at this point. 



7-3 



Chapter 7. Interrupts 



WRITING INTERRUPT SUBROUTINES 

In general, any registers or condition bits changed by an interrupt subroutine must be restored before returning 
to the interrupted program, or errors will occur. 

For example, suppose a program is interrupted just prior to the instruction: 

JC LOC . 

and the carry bit equals 1. If the interrupt subroutine happens to reset the carry bit before returning to the 
interrupted program, the jump to LOC which should have occurred will not, causing the interrupted program 
to produce erroneous results. 

Like any other subroutine then, any interrupt subroutine should save at least the condition bits and restore them 
before performing a RETURN operation. (The obvious and most convenient way to do this is to save the data 
in the stack, using PUSH and POP operations.) 

Further, the interrupt enable system is automatically disabled whenever an interrupt is acknowledged. Except in 
special cases, therefore, an interrupt subroutine should include an El instruction somewhere to permit detection 
and handling of future interrupts. One instruction after an El is executed, the interrupt subroutine may itself be 
interrupted. This process may continue to any level, but as long as all pertinent data are saved and restored, 
correct program execution will continue automatically. 

A typical interrupt subroutine, then, could appear as follows: 

Code Operand Comment 



PUSH 
El 



PSW 



POP 
RET 



PSW 



SAVE CONDITION BITS AND ACCUMULATOR 
RE-ENABLE INTERRUPTS 

PERFORM NECESSARY ACTIONS TO SERVICE 
THE INTERRUPT 



;RESTORE MACHINE STATUS 
;RETURN TO INTERRUPTED PROGRAM 



74 



APPENDIX A. INSTRUCTION SUMMARY 

This appendix summarizes the bit patterns and number of time states associated with every 8080 CPU 
instruction. The instructions are listed in both mnemonic (alphabetical) and operation code (numerical) 
sequence. 

When using this summary, note the following symbology. 

DDD represents a destination register. SSS represents a source register. Both DDD and SSS are interpreted 
as follows: 



DDD or SSS 



Interpretation 



000 
001 
010 
Oil 
100 
101 
110 

111 



Register B 
Register C 
Register D 
Register E 
Register H 
Register L 

A memory register or stack pointer or PSW 
(flags + accumulator) 
The accumulator 



Instruction execution time equals number of time periods multiplied by the duration of a time period. 

A time period may vary from 480 nanoseconds to 2 microseconds on the 8080 or 320 nanoseconds to 2 
microseconds on the 8085. Where two numbers of time periods are shown (eq.5/11), it means that the 
smaller number of time periods is required if a condition is not met, and the larger number of time periods 
is required if the condition is met. 



MNEMONIC 


















NUMBER OF TIME PERIODS 


Dy 


^6 


D5 


D4 


D3 


D2 


Dl 


Do 
























8080 


8085 


CALL 












1 







1 


17 


18 


CC 











1 










11/17 


9/18 


CNC 






















11/17 


9/18 


CZ 












1 










11/17 


9/18 


CNZ 























11/17 


9/18 


CP 






1 















11/17 


9/18 


CM 






1 




1 










11/17 


9/18 


CPE 






1 





1 










11/17 


9/17 


CPO 






1 
















11/17 


9/18 


RET 












1 








1 


10 


10 


RC 











1 











5/11 


6/12 


RNC 























5/11 


6/12 


RZ 












1 











5/11 


6/12 



ALL MNEMON/CS©1974, 1975, 1976, 1977 INTEL CORPORATION 



A-1 



Appendix A. Instruction Summary 



MNEMONIC 


Dy 


D6 


D5 


D4 


D3 


D2 


Dl 


Do 


NUMBER OF TIME PERIODS 


8080 


8085 


RNZ 
























5/11 


6/12 


RP 






1 


1 














5/11 


6/12 


RM 






1 


1 


1 











5/11 


6/12 


RPE 






1 





1 











5/11 


6/12 


RPO 






1 

















5/11 


6/12 


RST 






A 


A 


A 


1 


1 




11 


12 


IN 









1 


1 





1 




10 


10 


OUT 









1 








1 




10 


10 


LXI B 

























10 


10 


LXI D 











1 













10 


10 


LXI H 








1 
















10 


10 


LXI SP 








1 


1 













10 


10 


PUSH B 


1 


1 











1 







11 


12 


PUSH D 


1 


1 





1 





1 







11 


12 


PUSH H 


1 


1 


1 








1 







11 


12 


PUSH PSW 


1 


1 


1 


1 





1 







11 


12 


POP B 


1 


1 



















10 


10 


POP D 


1 


1 





1 













10 


10 


POP H 


1 


1 


1 
















10 


10 


POP PSW 


1 


1 


1 


1 













10 


10 


ST A 








1 


1 








1 





13 


13 


LDA 








1 


1 


1 





1 





13 


13 


XCHG 


1 


1 


1 





1 





1 




4 


4 


XTHL 


1 


1 


1 











1 




18 


16 


SPHL 


1 


1 


1 


1 


1 










5 


6 


PCHL 


1 


1 


1 





1 










5 


6 


DAD B 














1 










10 


10 


DAD D 











1 


1 










10 


10 


DAD H 








1 





1 










10 


10 


DAD SP 








1 


1 


1 










10 


10 


STAX B 




















1 





7 


7 


ST AX D 











1 








1 





7 


7 


LDAX B 














1 





1 





7 


7 


LDAX D 











1 


1 





1 





7 


7 


INX B 




















1 


1 


5 


6 


INX D 











1 








1 


1 


5 


6 


INX H 








1 











1 


1 


5 


6 


INX SP 








1 


1 








1 


1 


5 


6 


MOV ri S2 





1 


D 


D 


D 


s 


s 


s 


5 


4 


MOV M,r 





1 


1 


1 





s 


s 


s 


7 


7 


MOV r,M 





1 


D 


D 


D 




1 





7 


7 


HLT 





1 


1 


1 





1 


1 





7 


5 


MVI r 








D 


D 


D 


' 


1 





7 


7 


MVI M 








1 


1 







1 





10 


10 


INR 








D 


D 


D 










5 


4 


DCR 








D 


D 


D 







1 


5 


4 


ALL MNEMONICS© 1974, li 


>75, 1976 


, 1977 INTEL CORPORATION 






A-2 























Appendix A. Instruction Summary 





















NUMBER OF TIME PERIODS 


MNEMONIC 


D-, 


Dr 


Dc 


D^ 


Do 


Dt 


Di 


Da 




1 T 1 1 1 k^ 1 J 1 X_^ 1 1 » ^^^ 


7 


6 


"^5 


4 


3 


2 


1 





8080 


8085 


INR A 








1 




1 


1 








5 


4 


DCR A 








1 




1 


1 





1 


5 


4 


INR M 








1 







1 








10 


10 


DCR M 








1 







1 





1 


10 


10 


ADD r 
















s 


s 


s 


4 


4 


ADC r 













1 


s 


s 


s 


4 


4 


SUB r 















s 


s 


s 


4 


4 


SBB r 












1 


s 


s 


s 


4 


4 


AND r 







1 








s 


s 


s 


4 


4 


XRA r 







1 





1 


s 


s 


s 


4 


4 


ORA r 







1 







s 


s 


s 


4 


4 


CMP r 







1 




I 


s 


s 


s 


4 


4 


ADD M 























7 


7 


ADC M 













1 









7 


7 


SUB M 






















7 


7 


SBB M 












1 









7 


7 


AND M 







1 















7 


7 


XRA M 







1 





1 









7 


7 


ORA M 







1 














7 


7 


CMP M 







1 




1 









7 


7 


ADI 






















7 


7 


ACI 












1 









7 


7 


SUI 





















7 


7 


SBI 











1 









7 


7 


AN! 






1 















7 


7 


XRI 






1 





I 









7 


7 


OR! 






1 














7 


7 


CPI 






1 




1 









7 


7 


RLC 























4 


4 


RRC 














I 








4 


4 


RAL 






















4 


4 


RAR 













1 








4 


4 


JMP 






















10 


10 


JC 











1 










10 


7/10 


)NC 






















10 


7/10 


)Z 












1 










10 


7/10 


JNZ 























10 


7/10 


JP 






1 















10 


7/10 


JM 






1 




1 










10 


7/10 


)PE 






1 





1 










10 


7/10 


JPO 






1 
















10 


7/10 


DCX B 














1 







1 


5 


6 


DCX D 













1 







1 


5 


6 


DCX H 








1 





1 







1 


5 


6 


DCX SP 








1 




1 







1 


5 


6 



/I/./. MNEMONICS©1974, 1975, 1976, 1977 INTEL CORPORATION 



A-3 



Appendix A. Instruction Summary 



MNEMONIC 


r— 


De 




D5 


D4 


D3 


D2 


Dl 


Do 


NUMBER OF TIME PERIODS 


8080 


8085 


CMA 

STC 

CMC 

DAA 

SHLD 

LHLD 

RIM 

SIM 

El 

Dl 

NOP 











1 
1 












1 
1 







1 

1 





1 
1 
1 



1 

1 


1 


1 




1 
1 
1 
1 










1 
1 
1 
1 
1 
1 



1 
1 




1 
1 
1 
1 






1 

1 




4 

4 
4 
16 
16 

4 
4 
4 


4 
4 
4 
4 
16 
16 
4 
4 
4 
4 
4 



ALL MNEMONICS ©J974, 1975, 1976, 1977 INTEL CORPORATION 



A-4 



Appendix A. Instruction Summary 



The following is a summary of the instruction set: 
8080/85 CPU INSTRUCTIONS IN OPERATION CODE SEQUENCE 



OP 




OP 






OP 






CODE 


MNEMONIC 


CODE 


MNEMONIC 


CODE 


MNEMONIC 


00 


NOP 


2B 




DCX 


H 


56 


MOV 


D,M 


01 


LXI B,D16 


2C 


INR 


E 


57 


MOV 


D,A 


02 


STAX B 


2D 


DCR 


E 


58 


MOV 


E,B 


03 


INX B 


2E 


MVI 


E,D8 


59 


MOV 


E,C 


04 


INR B 


2F 


CMA 




5A 


MOV 


E,D 


OS 


[)CR B 


30 


SIM 




SB 


MOV 


E,E 


06 


MVI B,D8 


31 


EXI 


SPD16 


5C 


MOV 


E,EI 


07 


REC 


32 


STA 


Adr 


5D 


MOV 


E,E 


08 




33 


INX 


SP 


5E 


MOV 


E,M 


09 


DAD B 


34 


INR 


M 


5E 


MOV 


E,A 


OA 


EDAXB 


35 


DCR 


M 


60 


MOV 


H,B 


OB 


DCX B 


36 


MVI 


M,l)8 


61 


MOV 


H,C 


OC 


INR C 


37 


SEC 




62 


MOV 


H,D 


OD 


DCR C 


38 






63 


MOV 


H,E 


OE 


MVI C,D8 


39 


DAD 


SP 


64 


MOV 


H,H 


OE 


RRC 


3 A 


EDA 


Adi 


65 


MOV 


H,E 


10 




3B 


DCX 


SP 


66 


MOV 


H,M 


1 1 


EXI D,D16 


3C 


INR 


A 


67 


MOV 


H,A 


12 


STAX D 


3D 


DCR 


A 


68 


MOV 


L,B 


13 


INX D 


3E 


MVI 


A,D8 


69 


MOV 


E,C 


14 


INR D 


3F 


CMC 




6A 


MOV 


E,D 


IS 


DCR D 


40 


MOV 


B,B 


6B 


MOV 


E,E 


16 


MVI D,D8 


41 


MOV 


B,C 


6C 


MOV 


E,H 


17 


RAE 


42 


MOV 


B,D 


6D 


MOV 


E,E 


18 




4 3 


MOV 


B,E 


6E 


MOV 


E,M 


19 


DAD D 


44 


MOV 


B,H 


6E 


MOV 


E,A 


lA 


EDAXD 


45 


MOV 


B,E 


70 


MOV 


M ,B 


IB 


DCX D 


46 


MOV 


B,M 


7! 


MOV 


M,C 


IC 


INR E 


47 


MOV 


B,A 


72 


MOV 


M,D 


!D 


DRC E 


48 


MOV 


C,B 


73 


MOV 


M,E 


IE 


MVI E,D8 


49 


MOV 


C,C 


74 


MOV 


M,H 


lE 


RAR 


4 A 


MOV 


C,D 


7 5 


MOV 


M,E 


20 


RIM 


4B 


MOV 


C,E 


7 6 


HET 




21 


EXI H,D16 


4C 


MOV 


C,H 


77 


MOV 


M,A 


22 


SHED Adi 


4D 


MOV 


C,E 


78 


MOV 


A,B 


23 


INX H 


4E 


MOV 


C,M 


79 


MOV 


A,C 


24 


INR H 


4E 


MOV 


C,A 


7A 


MOV 


A,D 


25 


DC R H 


50 


MOV 


D,B 


7B 


MOV 


A ,17 


2 6 


MVI H,D8 


51 


MOV 


D,C 


7C 


MOV 


A,H 


27 


DAA 


52 


MOV 


D,D 


7D 


MOV 


A,L 


28 




5 3 


MOV 


D,E 


7E 


MOV 


A ,1V1 


29 


DAD H 


54 


MOV 


D,H 


7F 


MOV 


A, A 


2A 


EHLD Adr 


55 


MOV 


D,E , 


80 


ADD 


B 



OP 






OP 






OP 






CODE 


MNEMONIC 


CODE 


MNEMONIC 


CODE 


MNEMONIC 


81 


ADD 


C 


AC 


XRA 


H 


D7 


RST 


2 


82 


ADD 


D 


AD 


XRA 


E 


D8 


RC 




83 


ADD 


E 


AE 


XRA 


M 


D9 






84 


ADD 


H 


AF 


XRA 


A 


DA 


IC 


Adr 


85 


ADD 


E 


BO 


ORA 


B 


DB 


IN 


D8 


86 


ADD 


M 


Bl 


ORA 


C 


DC 


CC 


Adr 


87 


ADD 


A 


B2 


ORA 


D 


DD 






88 


ADC 


B 


B3 


ORA 


E 


DE 


SBI 


D8 


89 


ADC 


C 


B4 


ORA 


H 


DE 


RST 


3 


8A 


ADC 


D 


BS 


ORA 


E 


EO 


RPO 




8B 


ADC 


E 


B6 


ORA 


M 


El 


POP 


H 


8C 


ADC 


H 


B7 


ORA 


A 


E2 


|PO 


Adr 


8D 


ADC 


E 


B8 


CMP 


B 


E3 


XTHE 




8E 


ADC 


M 


B9 


CMP 


C 


E4 


CPO 


Adr 


8E 


ADC 


A 


BA 


CMP 


D 


E5 


PUSH 


H 


?® 


SUB 


B 


BB 


CMP 


E 


E6 


ANI 


D8 


91 


SUB 


C 


BC 


CMP 


H 


E7 


RST 


4 


92 


SUB 


D 


BD 


CMP 


E 


E8 


RPE 




93 


SUB 


E 


BE 


CMP 


M 


E9 


PCHE 




94 


SUB 


H 


BE 


CMP 


A 


EA 


JPE 


Adr 


95 


SUB 


E 


CO 


RNZ 




EB 


XCHC 




96 


SUB 


M 


CI 


POP 


B 


EC 


CPE 


Adr 


97 


SUB 


A 


C2 


\NZ 


Adr 


ED 






98 


SBB 


B 


(73 


)MP 


Adi 


EE 


XRl 


D8 


99 


SBB 


C 


C4 


CN/ 


Adr 


EF 


RST 


5 


9A 


SBB 


D 


C5 


PUSEl 


B 


FO 


RP 




9B 


SBB 


E 


C6 


ADI 


D8 


El 


POP 


PSW 


9C 


SBB 


U 


C7 


RST 





F2 


)P 


Adr 


9D 


SBB 


E 


C8 


R/. 




F3 


Dl 




9E 


SBB 


M 


C9 


REE 


Adr 


F4 


CP 


Adr 


9E 


SBB 


A 


CA 


yi 




1-5 


PUSH 


PSW 


AO 


ANA 


B 


CB 






F6 


ORI 


D8 


Al 


ANA 


C 


CC 


CZ 


Adr 


E7 


RST 


6 


A2 


ANA 


D 


CD 


CAEl 


Adr 


F8 


RM 




A3 


ANA 


E 


CE 


ACI 


D8 


F9 


SPUE 




A 4 


ANA 


H 


CE 


RST 


i 


FA 


JM 


Adr 


AS 


ANA 


E 


DO 


RNC 




EB 


El 




A 6 


ANA 


M 


Dl 


POP 


D 


EC 


CM 


Adi 


A7 


ANA 


A 


D2 


JNC 


Adr 


FD 






A8 


XRA 


B 


D3 


OUT 


D8 


F E 


CPl 


D8 


A9 


XRA 


C 


D4 


CNC 


Adr 


F F 


RST 


7 


AA 


XRA 


D 


DS 


PUSH 


D 








AB 


XRA 


E 


D6 


SUI 


D8 









D8 = constant, or logical/arithmetic expression that evaluates 
to an 8 bit data quantity. 



D16 = constant, or logical/arithmetic expiession that evaluates 
to a 1 6 bit data quantity 



Adr = 1 6-bit address 

ALL MNEMONICS © 1974, 1975, 1976, 1977 INTEL CORPORATION 



A -5 



Appendix A. Instruction Summary 



InstriRtion Set Giiicie 



I Ik' lolldwiiin is <i simim.ii\ nl ihc iiisti ULlioii scl 



ADD 

ADC 

SUB 

SBB 

ANA 

XRA 

ORA 

CMP 



RbGMc 



ADl 

ACl 

SUI 

SBi 

AN I 

XRl 

ORI 

CPI 



Rii: RAL RRC 

RAR CMA DAA 

INRl 



DCRi 



RtCM 



8 





ACCUMULATOR 


FLAGS 


1 







MOV RLGMj^.RLGMj^ 



LXIREG,^,,D,f, 



B 


C 



L 



STC CMC 

INX") 

dcxIreg,^ sphl* 

DAD 

-«-^ ) PCHL)i 



—I XCHG 



\\\c,\\ 


LOW 




SIACK ' POINT LR 




"* 






PROGRAM 


COUNTER 


^ RST 


Y^ . 





XTHL- 



]MP 

]C JNC~ 

I/- JNZ 

IP )M 

IPE JPO 



J 



RET 



CALL 

CC CNC^I RC RNC 

C/ CNZ I RZ RNZ 

1^1 CP CM ? 16 RP RM 1^ ^^16 

CPE CPoJ RPE RPO^ 



LDAX\ 
STAXf 



LHLD1 

sthd/ ^ic. 



BC.DE 



LDA 
STA 

MVl Dg 

MOV REGMg.REGMg 



MEMORY 



STACK 




OUT P 



8 



ourPUT 

PORTS 



POP / 



B,D,H,PSW 



CONTROL 
INSTRUCTIONS 

RST 

NOP 

MET 

El 

Dl 

SIM 

RIM 



8085 ONLY 



CODE 



MEANING 



REGM, 



M6 



REG 



16 



The operand may spcci'y one of the 8Tiit regislcrs A,B,C,D,E,H, or L or M (a mcmoiy 

reference via ihe 16-bit address in the H and L registers). The MOV instruction, which 

calls for two operands, can specify M for only one of its operands. 

Designates 8 bit immed ate operand. 

Designates a 16-bit addx^ss. 

Designates an 8-bit por' number. 

Designates a i 6-bit register pair (B&C,D&E,H&L,or SP). 

Designates a 16 -bit immediate operand. 



ALL MNEMONICS© 1974, 1975, 1976, 1977 INEEL CORPORAEION 



A-6 



APPENDIX B. ASSEMBLER DIRECTIVE SUMMARY 



Assembler directives are summarized alphabetically in this appendix. The following terms are used to describe 
the contents of directive fields. 



NOTATION 



Term 

Expression 

List 

Name 

Null 

Opiab 

Parameter 

String 
Text 



Interpretation 

Numerical expression evaluated during assembly; must evaluate 
to 8 or 16 bits depending on directive issued. 

Series of symbolic values or expressions, separated by commas. 

Symbol name terminated by a space. 

Field must be empty or an error results. 

Optional label; must be terminated by a colon. 

Dummy parameters are symbols holding the place of actual 
parameters (symbolic values or expressions) specified elsewhere 
in the program. 

Scries of any ASCII characters, surrounded by single quote marks. 
Single quote within string is shown as two consecutive single quotes. 

Series of ASCII characters. 



Macro definitions and calls allow the use of the special characters listed below. 
Character Function 



& 

( ) 



Ampersand. Used to concatenate symb(.>ls. 

Angle brackets. Used to delimit text, such as lists, that contain 
other delimiters. 

Double semicolon. Used before a comment in a macro clefinilion 
to prevent inclusion of the comment in each macro expansion. 

Exclamation point (escape character). Pl.tccd before <i deliniitet 
to be passed as a literal in an actual par.imeter. To pass a literal 
exclamation point, issue '!!.' 

Percent sign. Precedes actual paramcter'~ to be evaluated immedialely 
when the macro is called. 



ALL MNEMONICS ©1974, 1975, 1976, 1977 INTEL CORPORATION 



B-1 



Appendix B. Assembler Directive Summary 



SUMMARY OF DIRECTIVES 



FORMA T 
Label Opcode Operand(s) 

opiab; DB exp(s) or slring(s) 



opiab: 
oplab: 



DS 
DW 



expression 
exp(s) or str ng{s) 



FUNCTION 



Define 8-bil data bylc(s). Expressions must evaluate 
to one byte. 

Reserve data storage area of specified length. 

Define 16'bit data word(s). Strings limited to 1-2 
characters. 



oplab; 



ELSE 



Conditional assembly. Code between ELSE and 
ENDIF directives is assembled if expression in IF 
clause is FALSE. (See IF.) 



oplab; 



END 



expression 



Terminate assembler pass. Must be last statement of 
program. Program execution starts at 'exp,' if present; 
otherwise, at location 0. 



oplab; 



name 



ENDIF nul 



EQU 



expression 



Terminate conditional assembly block. 

Define symbol 'name' with value 'exp.' Symbol is not 
redef inable. 



oplab; 



expression 



Assemble code between IF and following ELSE or 
ENDIF directive if 'exp' is true. 



oplab; ORG 

name SET 



expression 



expression 



Set location counter to 'expression.' 

Define symbol 'n.ime' with value 'expression. 
Svmbol cm be redefined. 



MACRO DIRECTIVES 





FORMA T 




Label 


Opcode 


Operand(s) 


null 


ENDM 


null 


oplab; 


EXITM 


null 


oplab; 


IRP 


dummy pai 



FUNCTION 



Terminate macro definition. 



Alternate terminator of macro definition. (See ENDM.) 

Repeat instruction sequence, substituting one character 
form 'list' for 'dummy param' in each iteration. 



ALL MNEM0NICS©I974, 1975, 1976, 1977 INTEL CORPORATION 



B-2 



Appendix B. Assembler Directive Summary 



FORMA T 
Label Opcode Operand(s) 

opiab: IRPC dummy param,lext 



FUNCTION 



Repeal instruction sequence, substituting one 
character from 'text' for 'dummy param' in each 
iteration. 



nut 



LOCAL label name(s) 



MACRO dummy param(s) 



Specify label(s) in macro definition to have local 
scope. 

Define macro 'name' and dummy parameter(s) to be 
used in macro definition. 



opIab: 



REPT 



expression 



Repeat REPT block 'expression' times. 



RELOCATION DIRECTIVES 



FORMA T 



FUNCTION 



Label Opcode Operand(s) 

opiab: ASEG null 



opIab: 



oplab: 



opIab: 



CSEG 



DSEG 



boundary specification 



boundary specification 



EXTRN name(s) 



Assemble subsequent instructions and data in the 
absolute mode. 

Assemble subsequent instructions and data in the 
relocatable mode using the code location counter. 

Assemble subsequent instructions and data in the 
relocatable mode using the data location counter. 

identify symbols used in this program module but 
defined in a different module. 



oplab: 
oplab: 



NAME module— name 



PUBLIC name(s) 



Assigns a name to the program module. 

Identify symbols defined in this module that are to 
be available to other modules. 



oplab: 



STKLN expression 



Specify the number of bytes to be reserved for the 
stack for this module. 



ALL MNEM0NICS©I974, 1975, 1976, 1977 INTEL CORPORATION 



B-3 



APPENDIX C. ASCII CHARACTER SET 



ASCII CODES 

The 8080 and 8085 use the seven-hit ASCM code, with the high-order eighth bit 
(parity bit) always reset. 



GRAPHIC OR 


ASCII 


CONTROL 


(HEXADECIMAL) 


NUL 


00 


SOH 


01 


STX 


02 


ETX 


03 


EOT 


04 


ENQ 


05 


ACK 


06 


BEL 


07 


BS 


08 


HT 


09 


LF 


OA 


VT 


OB 


FF 


OC 


CR 


CD 


SO 


OE 


SI 


OF 


DLE 


10 


DCl (X-ON) 


n 


DC2 (TAPE) 


12 


DC3 (X-OFF) 


13 


DC4 (TA-Pe^ 


14 


NAK 


15 


SYN 


1G 


ETB 


17 


CAN 


18 


EM 


19 


SUB 


1A 


ESC 


IB 


FS 


1C 


GS 


ID 


RS 


IE 


US 


IF 


SP 


20 


1 


21 


" 


22 


^ 


23 


s 


24 


"■,'0 


25 


& 


26 


' 


27 


( 


28 


) 


29 


* 


2A 



GRAPHIC OR 


ASCII 


CONTROL 


(HEXADECIMAL) 


+ 


2B 




2C 


- 


2D 




2E 


/ 


2F 





30 


1 


31 


2 


32 


3 


33 


4 


34 


5 


35 


6 


36 


7 


37 


8 


38 


9 


39 




3A 




38 


'.: 


3C 




3D 


> 


3E 


? 


3F 


(H-, 


40 


A 


41 


B 


42 


C 


43 


D 


44 


E 


45 


F 


46 


G 


47 


H 


48 


1 


49 


J 


4A 


K 


4B 


L 


4C 


M 


4D 


N 


4E 





4F 


P 


50 


Q 


51 


R 


52 


S 


53 


T 


54 


U 


55 



GRAPHIC OR 


ASCII 


CONTROL (HEXADECIMAL) 


V 


56 


w 


57 


X 


58 


Y 


59 


Z 


5A 


1 


5B 




5C 


1 


5D 


A (1) 


5E 


- (-) 


5F 


- 


60 


a 


61 


I) 


62 


c 


63 


d 


64 


(' 


65 


1 


66 


() 


67 


h 


68 


1 


69 


1 


6A 


k 


6B 


1 


6C 


tT^. 


6D 


n 


6E 





6F 


P 


70 


(| 


71 


t 


72 


s 


73 


I 


74 


u 


75 


V 


76 


vv 


77 


X 


78 


V 


79 


/ 


7A 


) 


7B 


: 


7C 


; (ALT l\/10DE) 


7D 


- 


7E 


DEL (RUB OUT) 


7F 



C-1 



APPENDIX D. 
BINARY-DECIMAL-HEXADECIMAL CONVERSION TABLES. 



D-1 



Appendix D. Binary-Decimal-Hexadecimal Conversion Tables 



POWERS OF TWO 

„n -n 

2 n 2 

1 10 

2 1 0.5 
4 2 0.25 
8 3 0.125 

16 4 0.062 5 

32 5 0.031 25 

64 6 0.015 625 

128 7 0.007 812 5 

256 8 0.003 906 25 

512 9 0.001 953 125 

1 024 10 0.000 976 562 5 

2 048 1 1 0.000 488 281 25 

4 096 12 0.000 244 140 625 

8 192 13 0.000 122 070 312 5 

16 384 14 0.000 061 035 156 25 

32 768 15 0.000 030 517 578 125 

65 536 16 0.000 015 258 789 062 5 

131 072 17 000 007 629 394 531 25 

262 144 18 000 003 814 697 265 625 

524 288 19 000 001 907 348 632 812 5 

1 048 576 20 000 OOO 953 674 316 406 25 

2 097 152 21 000 000 476 837 158 203 125 

4 194 304 22 000 000 238 418 579 101 562 5 
8 388 608 23 0.000 000 119 209 289 550 781 25 

16 777 216 24 000 000 059 604 644 775 390 625 

33 554 432 25 000 000 029 802 322 387 695 312 5 

67 108 864 26 000 000 014 901 161 193 847 656 25 

134 217 728 27 000 000 007 450 580 596 923 828 125 

268 435 456 28 000 000 003 725 290 298 461 914 062 5 

536 870 912 29 000 000 001 862 645 149 230 957 031 25 

1 073 741 824 30 000 000 000 931 j22 574 615 478 515 625 

2 147 483 648 31 000 000 000 465 661 287 307 739 257 812 5 

4 294 967 296 32 000 000 000 232 £30 643 653 869 628 906 26 

8 589 934 592 33 000 000 000 116 4 15 321 826 934 814 453 12S 

17 179 869 184 34 000 000 000 058 ;07 660 913 467 407 226 56? 5 

34 359 738 368 35 000 000 000 029 103 830 456 733 703 613 28' 25 

68 719 476 736 36 000 000 000 014 551 915 228 366 851 806 640 625 

137 438 953 472 37 000 000 000 007 275 957 614 183 425 903 320 312 5 

274 877 906 944 38 000 000 000 003 637 978 807 091 712 951 660 156 25 

549 755 813 888 39 000 000 000 001 E;18 989 403 545 856 475 830 078 125 

1 099 511 627 776 40 000 000 000 000 909 494 701 772 928 237 915 039 062 5 

2 199 023 255 552 41 000 000 000 000 454 747 350 886 464 118 95"'' 519 531 25 
4 398 046 511 104 42 000 000 000 000 227 373 675 443 232 059 478 759 765 625 

8 796 093 022 208 43 000 000 000 000 "13 686 837 721 616 029 739 379 882 812 5 

17 592 186 044 416 44 000 000 000 000 056 843 418 860 808 014 869 689 941 406 25 

35 184 372 088 832 45 000 000 000 000 028 421 709 430 404 007 43'' 844 970 703 125 

70 368 744 177 664 46 000 000 000 000 014 210 854 715 202 003 717 422 485 351 562 5 

140 737 488 355 328 47 000 000 000 000 007 105 427 357 601 001 B5ii 711 242 675 781 25 

281 474 976 710 656 48 000 000 000 000 003 552 713 678 800 500 929 355 621 337 890 625 

562 949 953 421 312 49 000 000 000 000 001 776 356 839 400 250 46-; 677 810 668 945 312 5 

1 125 899 906 842 624 50 000 000 000 000 000 888 178 419 700 125 232 338 905 334 472 656 25 

? 251 799 813 685 248 51 000 000 000 000 000 444 089 209 850 062 616 169 452 667 236 328 125 

4 503 599 627 370 496 52 000 000 000 000 000 222 044 604 925 031 308 084 726 333 618 164 062 5 

9 007 199 254 740 992 53 000 000 000 000 000 111 022 302 462 515 654 042 363 166 809 082 031 25 

18 014 398 509 481 984 54 000 000 000 000 000 055 511 151 231 257 827 021 181 583 404 541 015 625 

36 028 797 018 963 968 55 000 000 000 000 000 027 755 575 615 628 913 510 590 791 702 270 507 812 5 

72 057 594 037 927 936 56 000 000 000 000 000 013 877 787 807 814 456 755 295 39b 851 135 253 906 25 

144 115 188 075 855 872 57 000 000 000 000 000 006 938 893 903 907 228 377 64 7 697 925 567 676 950 125 

288 230 376 151 711 744 58 000 000 000 000 000 003 469 446 951 953 614 188 823 848 962 783 813 476 562 5 

576 460 752 303 423 488 59 000 000 000 000 000 001 734 723 475 976 80 7 094 411 924 481 391 906 738 281 25 

1 152 921 504 606 846 976 60 000 000 000 000 DOO 000 867 361 737 988 403 547 205 962 240 695 953 369 140 625 

2 305 343 009 213 693 952 61 000 000 000 000 DOO 000 433 680 868 994 201 773 602 981 120 347 976 684 570 312 5 
4 611 686 018 427 387 904 6? 000 000 000 000 DOO 000 216 840 434 497 100 886 801 490 560 173 988 342 285 156 25 
9 223 372 036 854 775 808 63 000 000 000 000 DOO 000 108 420 217 248 550 443 400 745 280 086 994 171 142 578 125 



D-2 



Appendix D. Binaty-Decimal-Hexadecimal Conversion Tables 



POWERS OF 16 (IIM BASE 10) 













16 


n 






16 


■11 
















1 





0.10000 


00000 


00000 


00000 


X 


10 












16 


1 


0.62500 


00000 


00000 


00000 


X 


10-' 












256 


2 


0.39062 


50000 


00000 


00000 


X 


10-^ 










4 


096 


3 


0.24414 


06250 


00000 


00000 


X 


10^3 










65 


536 


4 


0.15258 


78906 


25000 


00000 


X 


lO"* 








1 


048 


576 


5 


0,95367 


43164 


06250 


00000 


X 


10"* 








16 


777 


216 


6 


0.59604 


64477 


53906 


25000 


X 


10-^ 








268 


435 


456 


7 


0.37252 


90298 


46191 


40625 


X 


lO'* 






4 


294 


967 


296 


8 


0.23283 


06436 


53869 


62891 


X 


10-" 






68 


719 


476 


736 


9 


0.14551 


91522 


83668 


51807 


X 


10'° 




1 


099 


511 


627 


776 


10 


0.90949 


47017 


72928 


23792 


X 


10'^ 




17 


592 


186 


044 


416 


11 


0.56843 


41886 


08080 


14870 


X 


io-'3 




281 


474 


976 


710 


656 


12 


0.35527 


13678 


80050 


09294 


X 


io-"» 


4 


503 


599 


627 


370 


496 


13 


0.22204 


46049 


25031 


30808 


X 


10-'^ 


72 


057 


594 


037 


927 


936 


14 


0.13877 


78780 


78144 


56755 


X 


10'* 


52 


921 


504 


606 


846 


976 


15 


0.86736 


17379 


88403 


54721 


X 


10-"* 



POWERS OF 10 (IN BASE 16) 



3 

23 

163 

DEO 

8AC7 



2 

17 

E8 

918 

5AF3 

8D7E 

8652 



1 

F 

98 

5F5 

3B9A 

540B 

4876 

D4A5 

4E72 

107A 

A4C6 

6FC1 



4578 5D8A 
B6B3 A764 
2304 89E8 



10" 
1 

A 
64 
3E8 
2710 
86 AO 
4240 
9680 
E100 
CAOO 
E400 10 
E800 1 1 
1000 12 
AOOO 13 
4000 14 
8000 1 5 
0000 16 
0000 17 
0000 18 
0000 19 



1 .0000 

0.1999 

0.28F5 

0.4189 

0.68DE; 

0.A7CE. 

0.1 0C6 

0.1AD7 

0.2AF3 

0.44B8 

0.6DF;. 

O.AFEB 

0,1197 

1C25 

0.2D09 

0480E 

0.734A 

0.B877 

0.1272 

0.1D83 



10 
0000 
9999 
C28F 
374B 
8BAC 
AC47 
F7A0 
F29A 
1DC4 
2FA0 
7F67 
FFOB 
9981 
C268 
370D 
BE7B 
CA5F 
AA32 
5DD1 
C94F 



0000 

9999 

5C28 

C6A7 

710C 

1B47 

B5ED 

BCAF 

6118 

9B5A 

SEF6 

CB24 

2DEA 

4976 

4257 

9D58 

6226 

36A4 

D243 

B6D2 



0000 

999 A 

F5C3 

EF9E 

B296 

8423 

8D37 

4858 

73BF 

52CC 

EADF 

AAFF 

1119 

81C2 

3604 

566D 

FOAE 

B449 

ABA1 

AC35 



16 ' 
16^ 
16-^ 
16 * 
16* 
16-' 
16"* 
16-^ 



16 

16 

16" 

16 

16" 

16 

16" 

16" 

16" 

16 



-9 



D-3 



Appendix D. Binary-Decimal-Hexadecimal Conversion Tables 

HEXADECIMAL-DECIMAL INTEGER CONVERSION 

The table below provides for direct conversions between hexadecimal integers in the range 0-FFF and decimal integers in the 
range 0-4095. For conversion of larger integers, the table values may be added to the following figures: 



Hexadecimal 


Decimal 


Hexadecimal 


Decimal 


01 000 


4 096 


20 000 


131 072 


02 000 


8 192 


30 000 


196 608 


03 000 


12 288 


40 000 


262 144 


04 000 


16 384 


50 000 


327 680 


05 000 


20 480 


60 000 


393 216 


06 000 


24 576 


70 000 


458 752 


07 000 


28 672 


80 000 


524 288 


08 000 


32 768 


90 000 


589 824 


09 000 


36 864 


AOOOO 


655 360 


OAOOO 


40 960 


BO 000 


720 896 


OB 000 


45 056 


CO 000 


786 432 


OCOOO 


49 152 


DO 000 


851 968 


ODOOO 


53 248 


EOOOO 


917 504 


OE 000 


57 344 


FOOOO 


983 040 


OF 000 


61 440 


100 000 


1 048 576 


10 000 


65 536 


200 000 


2 097 152 


11 000 


69 632 


300 000 


3 145 728 


12 000 


73 728 


400 000 


4 1 94 304 


13 000 


77 824 


500 000 


5 242 880 


14 000 


81 920 


600 000 


6 291 456 


15 000 


86 016 


700 000 


7 340 032 


16 000 


90 112 


800 000 


8 388 608 


17 000 


94 208 


900 000 


9 437 184 


18 000 


98 304 


AOO 000 


10 485 760 


19 000 


102 400 


BOO 000 


1 1 534 336 


1A000 


106 496 


COO 000 


12 582 912 


IB 000 


110 592 


DOO 000 


13 631 488 


1C000 


114 688 


EGO 000 


14 680 064 


ID 000 


118 784 


FOO 000 


15 728 640 


IE 000 


122 880 


1 000 000 


16 777 216 


IF 000 


126 976 


2 000 000 


33 554 432 








1 


2 


3 


4 


5 


6 


7 


8 


9 


A 


B 


C 


D 


E 


F 


000 


0000 


0001 


0002 


0003 


0004 


0005 


0006 


0007 


0008 


0009 


0010 


0011 


0012 


0013 


0014 


0015 


010 


0016 


0017 


0018 


0019 


0020 


0021 


0022 


0023 


0024 


0025 


0026 


0027 


0028 


0029 


0030 


0031 


020 


0032 


0033 


0034 


0035 


0036 


0037 


0038 


0039 


0040 


0041 


0042 


0043 


0044 


0045 


0046 


0047 


030 


0048 


0049 


0050 


0051 


0052 


0053 


0054 


0055 


0056 


0057 


0058 


0059 


0060 


0061 


0062 


0063 


040 


0064 


0065 


0066 


0067 


0068 


0069 


0070 


0071 


0072 


0073 


0074 


0075 


0076 


0077 


0078 


0079 


050 


0080 


0081 


0082 


0083 


0084 


0085 


0086 


0087 


0088 


0089 


0090 


0091 


0092 


0093 


0094 


0095 


060 


0096 


0097 


0098 


0099 


0100 


0101 


0102 


0103 


0104 


0105 


0106 


0107 


0108 


0109 


0110 


0111 


070 


0112 


0113 


0114 


0115 


0116 


0117 


0118 


0119 


0120 


0121 


0122 


0123 


0124 


0125 


0126 


0127 


080 


0128 


0129 


0130 


0131 


0132 


0133 


0134 


0135 


0136 


0137 


0138 


0139 


0140 


0141 


0142 


0143 


090 


0144 


0145 


0146 


0147 


0148 


0149 


0150 


0151 


0152 


0153 


0154 


0155 


0156 


0157 


0158 


0159 


OAO 


0160 


0161 


0162 


0163 


0164 


0165 


0166 


0167 


0168 


0169 


0170 


0171 


0172 


0173 


0174 


0175 


OBO 


0176 


0177 


0178 


0179 


0180 


0181 


0182 


0183 


0184 


0185 


0186 


0187 


0188 


0189 


0190 


0191 


OCO 


0192 


0193 


0194 


0195 


0196 


0197 


0198 


0199 


0200 


0201 


0202 


0203 


0204 


0205 


0206 


0207 


ODO 


0208 


0209 


0210 


0211 


0212 


0213 


0214 


0215 


0216 


0217 


0218 


0219 


0220 


0221 


0222 


0223 


OEO 


0224 


0225 


0226 


0227 


0228 


0229 


0230 


0231 


0232 


0233 


0234 


0235 


0236 


0237 


0238 


0239 


OFO 


0240 


0241 


0242 


0243 


0244 


0245 


0246 


0247 


0248 


0249 


0250 


0251 


0252 


0253 


0254 


0255 



D-4 



Appendix D. Binary-Decimal-Hexadecimal Conversion Tables 



HEXADECIMAL-DECIMAL INTEGER COIMVERSIOIM (Cont'd) 








1 


2 


3 


4 


5 


6 


7 


8 


9 


A 


B 


C 


D 


E 


F 


100 


0256 


0257 


0258 


0259 


0260 


0261 


0262 


0263 


0264 


0265 


02e;6 


0267 


0268 


0269 


0270 


0271 


110 


0272 


0273 


0274 


0275 


0276 


0277 


0278 


0279 


0280 


0281 


0282 


0283 


0284 


0285 


0286 


0287 


120 


0288 


0289 


0290 


0291 


0292 


0293 


0294 


0295 


0296 


0297 


0298 


0299 


0300 


0301 


0302 


0303 


130 


0304 


0305 


0306 


0307 


0308 


0309 


0310 


0311 


0312 


0313 


0314 


0315 


0316 


0317 


0318 


0319 


140 


0320 


0321 


0322 


0323 


0324 


0325 


0326 


0327 


0328 


0329 


0330 


0331 


0331 


0333 


0334 


0335 


150 


0336 


0337 


0338 


0339 


0340 


0341 


0342 


0343 


0344 


0345 


0346 


0347 


0348 


0349 


0350 


0351 


160 


0352 


0353 


0354 


0355 


0356 


0357 


0358 


0359 


0360 


0361 


0362 


0363 


0364 


0365 


0366 


0367 


170 


0368 


0369 


0370 


0371 


0372 


0373 


0374 


0375 


0376 


0377 


0378 


0379 


0380 


0381 


0382 


0383 


180 


0384 


0385 


0386 


0387 


0388 


0389 


0390 


0391 


0392 


0393 


0394 


0395 


0396 


0397 


0398 


0399 


190 


0400 


0401 


0402 


0403 


0404 


0405 


0406 


0407 


0408 


0409 


0410 


0411 


0412 


0413 


0414 


0415 


1A0 


0416 


0417 


0418 


0419 


0420 


0421 


0422 


0423 


0424 


0425 


0426 


0427 


0428 


0429 


0430 


0431 


1B0 


0432 


0433 


0434 


0435 


0436 


0437 


0438 


0439 


0440 


0441 


0442 


0443 


0444 


0445 


0446 


0447 


'ico 


0448 


0449 


0450 


0451 


0452 


0453 


0454 


0455 


0456 


0457 


0458 


0459 


0460 


0461 


0462 


0463 


1D0 


0464 


0465 


0466 


0467 


0468 


0469 


0470 


0471 


0472 


0473 


0474 


0475 


0476 


0477 


0478 


0479 


1E0 


0480 


0481 


0482 


0483 


0484 


0485 


0486 


0487 


0488 


0489 


0490 


0491 


0492 


0493 


0494 


0495 


1F0 


0496 


0497 


0498 


0499 


0500 


0501 


0502 


0503 


0504 


0505 


0506 


050V 


0508 


0509 


0510 


0511 


200 


0512 


0513 


0514 


0515 


0516 


0517 


0518 


0519 


0520 


0521 


0522 


0523 


0524 


0525 


0526 


0527 


210 


0528 


0529 


0530 


0531 


0532 


0533 


0534 


0535 


0536 


0537 


0538 


0539 


0540 


0541 


0542 


0543 


220 


0544 


0545 


0546 


0547 


0548 


0549 


0550 


0551 


0552 


0553 


0554 


0555 


0556 


0557 


0558 


0559 


230 


0560 


0561 


0562 


0563 


0564 


0565 


0566 


0567 


0568 


0569 


0570 


0571 


0572 


0573 


0574 


0575 


240 


0576 


0577 


0578 


0579 


0580 


0581 


0582 


0583 


0584 


0585 


0586 


0587 


0588 


0589 


0590 


0591 


250 


0592 


0593 


0594 


0595 


0596 


0597 


0598 


0599 


0600 


0601 


0602 


0603 


0604 


0605 


0606 


0607 


260 


0608 


0609 


0610 


0611 


0612 


0613 


0614 


0615 


0616 


0617 


0618 


0619 


0620 


0621 


0622 


0623 


270 


0624 


0625 


0626 


0627 


0628 


0629 


0630 


0631 


0632 


0633 


0634 


0635 


0636 


0637 


0638 


0639 


280 


0640 


0641 


0642 


0643 


0644 


0645 


0646 


0647 


0648 


0649 


0650 


0651 


0652 


0653 


0654 


0655 


290 


0656 


0657 


0658 


0659 


0660 


0661 


0662 


0663 


0664 


0665 


0666 


0667 


0668 


0669 


0670 


0671 


2A0 


0672 


0673 


0674 


0675 


0676 


0677 


0678 


0679 


0680 


0681 


0682 


0683 


0684 


0685 


0686 


0687 


2 BO 


0688 


0689 


0690 


0691 


0692 


0693 


0694 


0695 


0696 


0697 


0698 


0699 


0700 


0701 


0702 


0703 


. 2C0 


0704 


0705 


0706 


0707 


0708 


0709 


0710 


0711 


0712 


0713 


0714 


0715 


0716 


0717 


0718 


0719 


2D0 


0720 


0721 


0722 


0723 


0724 


0725 


0726 


0727 


0728 


0729 


0730 


0731 


0732 


0733 


0734 


0735 


2E0 


0736 


0737 


0738 


0739 


0740 


0741 


0742 


0743 


0744 


0745 


0746 


0747 


0748 


0749 


0750 


0751 


2F0 


0752 


0753 


0754 


0755 


0756 


0757 


0758 


0759 


0760 


0761 


0762 


0763 


0764 


0765 


0766 


0767 


300 


0768 


0769 


0770 


0771 


0772 


0773 


0774 


0775 


0776 


0777 


0778 


0779 


0780 


0781 


0782 


0783 


310 


0784 


0785 


0786 


0787 


0788 


0789 


0790 


0791 


0792 


0793 


0794 


0795 


0796 


0797 


0798 


0799 


320 


0800 


0301 


0802 


0803 


0804 


0805 


0806 


0807 


0808 


0809 


0810 


0811 


0812 


0813 


0814 


0815 


330 


0816 


0817 


0818 


0819 


0820 


0821 


0822 


0823 


0824 


0825 


0826 


0827 


0828 


0829 


0830 


0831 


340 


0832 


0833 


0834 


0835 


0836 


0837 


0838 


0839 


0840 


0841 


0842 


0843 


0844 


0845 


0846 


0847 


350 


0848 


0849 


0850 


0851 


0852 


0853 


0854 


0855 


0856 


0857 


0858 


0859 


0860 


0861 


0862 


0863 


360 


0864 


0865 


0866 


0867 


0868 


0869 


0870 


0871 


0872 


0873 


0874 


0875 


0876 


0877 


0878 


0879 


370 


0880 


0881 


0882 


0883 


0884 


0885 


0886 


0887 


0888 


0889 


0890 


0891 


0892 


0893 


0894 


0895 


380 


0896 


0897 


0898 


0899 


0900 


0901 


0902 


0903 


0904 


0905 


0906 


0907 


0908 


0909 


0910 


0911 


390 


0212 


0913 


0914 


0915 


0916 


0917 


0918 


0919 


0920 


0921 


0922 


0923 


0924 


0925 


0926 


0927 


3A0 
'3B0 


0928 


0929 


0930 


0931 


0932 


0933 


0934 


0935 


0936 


0937 


0938 


0939 


0940 


0941 


0942 


0943 


0944 


0945 


0946 


0947 


0948 


0949 


0950 


0951 


0952 


0953 


0954 


0955 


0956 


0957 


0958 


0959 


3C0 


0960 


0961 


0962 


0963 


0964 


0965 


0966 


0967 


0968 


0969 


0970 


0971 


0972 


0973 


0974 


0975 


3D0 


0976 


0977 


0978 


0979 


0980 


0981 


0982 


0983 


0984 


0985 


0986 


0987 


0988 


0989 


0990 


0991 


3E0 


0992 


0993 


0994 


0995 


0996 


0997 


0998 


0999 


1000 


1001 


1002 


1003 


1004 


1005 


1006 


1007 


3F0 


1008 


1009 


1010 


1011 


1012 


1013 


1014 


1015 


1016 


1017 


1018 


1019 


1020 


1021 


1022 


1023 



D-5 



Appendix D. Binary-Decimal-Hexadecimal Conversion Tables 



HEXADECIMAL-DEC MAL INTEGER CONVERSION (Cont'd) 








1 


2 


3 


4 


5 


6 


7 


8 


9 


A 


B 


C 


D 


E 


F 


400 


1024 


1025 


1026 


1027 


1028 


1029 


1030 


1031 


1032 


1033 


1034 


1035 


1036 


1037 


1038 


1039 


410 


1040 


1041 


1042 


1043 


1044 


045 


1046 


1047 


1048 


049 


1050 


1051 


1052 


1053 


1054 


1055 


420 


1056 


1057 


1058 


1059 


1060 


1061 


1062 


1063 


1064 


1065 


1066 


1067 


1068 


1069 


1070 


1071 


430 


1072 


1073 


1074 


1075 


1076 


077 


1078 


1079 


1080 


081 


1082 


1083 


1084 


1085 


1086 


1087 


440 


1088 


1089 


1090 


1091 


1092 


093 


1094 


1095 


1096 


097 


1098 


1099 


1100 


1101 


1102 


1103 


450 


1104 


1105 


1106 


1107 


1108 


109 


1110 


1111 


1112 


113 


1114 


1115 


1116 


1117 


1118 


1119 


460 


1120 


1121 


1122 


1123 


1124 


125 


1126 


1127 


1128 


129 


1130 


1131 


1132 


1133 


1134 


1135 


470 


1136 


1137 


1138 


1139 


1140 


141 


1142 


1143 


1144 


145 


1146 


1147 


1148 


1149 


1150 


1151 


480 


1152 


1153 


1154 


1155 


1156 


157 


1158 


1159 


1160 


161 


1162 


1163 


1164 


1165 


1166 


1167 


490 


1168 


1169 


1170 


1171 


1172 


173 


1174 


1175 


1176 


177 


1178 


1179 


1180 


1181 


1182 


1183 


4A0 


1184 


1185 


1186 


1187 


1188 


189 


1190 


1191 


1192 


193 


1194 


1195 


1196 


1197 


1198 


1199 


4B0 


1200 


1201 


1202 


1203 


1204 


205 


1206 


1207 


1208 


209 


1210 


1211 


1212 


1213 


1214 


1215 


4C0 


1216 


1217 


1218 


1219 


1220 


221 


1222 


1223 


1224 


225 


1226 


1227 


1228 


1229 


1230 


1231 


4 DO 


1232 


1233 


1234 


1235 


1236 


237 


1238 


1239 


1240 


241 


1242 


1243 


1244 


1245 


1246 


1247 


4E0 


1248 


1249 


1250 


1251 


1252 


253 


1254 


1255 


1256 


257 


1258 


1259 


1260 


1261 


1262 


1263 


4F0 


1264 


1265 


1266 


1267 


1268 


269 


1270 


1271 


1272 


273 


1274 


1275 


1276 


1277 


1278 


1279 


500 


1280 


1281 


1282 


1283 


1284 


285 


1286 


1287 


1288 


289 


1290 


1291 


1292 


1293 


1294 


1295 


510 


1296 


1297 


1298 


1299 


1300 


301 


1302 


1303 


1304 


305 


1306 


1307 


1308 


1309 


1310 


1311 


520 


1312 


1313 


1314 


1315 


1316 


317 


1318 


1319 


1320 


321 


1322 


1323 


1324 


1325 


1326 


1327 


530 


1328 


1329 


1330 


1331 


1332 


333 


1334 


1335 


1336 


337 


1338 


1339 


1340 


1341 


1342 


1343 


540 


1344 


1345 


1346 


1347 


1348 


349 


1350 


1351 


1352 


353 


1354 


1355 


1356 


1357 


1358 


1359 


550 


1360 


1361 


1362 


1363 


1364 


365 


1366 


1367 


1368 


369 


1370 


1371 


1372 


1373 


1374 


1375 


560 


1376 


1377 


1378 


1379 


1380 


381 


1382 


1383 


1384 


385 


1386 


1387 


1388 


1389 


1390 


1391 


570 


1392 


1393 


1394 


1395 


1396 


397 


1398 


1399 


1400 


401 


1402 


1403 


1404 


1405 


1406 


1407 


580 


1408 


1409 


1410 


1411 


1412 


413 


1414 


1415 


1416 


417 


1418 


1419 


1420 


1421 


1422 


1423 


590 


1424 


1425 


1426 


1427 


1428 


429 


1430 


1431 


1432 


433 


1434 


1435 


1436 


1437 


1438 


1439 


5A0 


1440 


1441 


1442 


1443 


1444 


445 


1446 


1447 


1448 


449 


1450 


1451 


1452 


1453 


1454 


1455 


5B0 


1456 


1457 


1458 


1459 


1460 


461 


1462 


1463 


1464 


465 


1466 


1467 


1468 


1469 


1470 


1471 


5C0 


1472 


1473 


1474 


1475 


1476 


477 


1478 


1479 


1480 


481 


1482 


1483 


1484 


1485 


1486 


1487 


5D0 


1488 


1489 


1490 


1491 


1492 


493 


1494 


1495 


1496 1 


497 


1498 


1499 


1500 


1501 


1502 


1503 


5E0 


1504 


1505 


1506 


1507 


1508 


509 


1510 


1511 


1512 


513 


1514 


1515 


1516 


1517 


1518 


1519 


5F0 


1520 


1521 


1522 


1523 


1524 


525 


1526 


1527 


1528 1 


529 


1530 


1531 


1532 


1533 


1534 


1535 


600 


1536 


1537 


1538 


1539 


1540 


541 


1542 


1543 


1544 


545 


1546 


1547 


1548 


1549 


1550 


1551 


610 


1552 


1553 


1554 


1555 


1556 


557 


1558 


1559 


1560 


561 


1562 


1563 


1564 


1565 


1566 


1567 


620 


1568 


1569 


1570 


1571 


1572 


573 


1574 


1575 


1576 


577 


1578 


1579 


1580 


1581 


1582 


1583 


630 


1584 


1585 


1586 


1587 


1588 


589 


1590 


1591 


1592 


593 


1594 


1595 


1596 


1597 


1598 


1599 


640 


1600 


1601 


1602 


1603 


1604 


605 


1606 


1607 


1608 


609 


1610 


1611 


1612 


1613 


1614 


1615 


650 


1616 


1617 


1618 


1619 


1620 


621 


1622 


1623 


1624 


625 


1626 


1627 


1628 


1629 


1630 


1631 


660 


1632 


1633 


1634 


1635 


1636 


637 


1638 


1639 


1640 


64.1 


1642 


1643 


1644 


1645 


1646 


1647 


670 


1648 


1649 


1650 


1651 


1652 


653 


1654 


1655 


1656 


657 


1658 


1659 


1660 


1661 


1662 


1663 


680 


1664 


1665 


1666 


1667 


1668 


669 


1670 


1671 


1672 


673 


1674 


1675 


1676 


1677 


1678 


1679 


690 


1680 


1681 


1682 


1683 


1684 


685 


1686 


1687 


1688 


689 


1690 


1691 


1692 


1693 


1694 


1695 


6A0 


1696 


1697 


1698 


1699 


1700 


701 


1702 


1703 


1704 


705 


1706 


1707 


1708 


1709 


1710 


1711 


6B0 


1712 


1713 


1714 


1715 


1716 


717 


i:'18 


1719 


1720 


721 


1722 


1723 


1724 


1725 


1726 


1727 


6C0 


1728 


1729 


1730 


1731 


1732 


733 


1734 


1735 


1736 


737 


1738 


1739 


1740 


1741 


1742 


1743 


6D0 


1744 


1745 


1746 


1747 


1748 


749 


1750 


1751 


1752 


753 


1754 


1755 


1756 


1757 


1758 


1759 


6E0 


1760 


1761 


1762 


1763 


1764 


765 


1766 


1767 


1768 


769 


1770 


1771 


1772 


1773 


1774 


1775 


6F0 


1776 


1777 


1778 


1779 


1780 


781 


1782 


1783 


1784 


785 


1786 


1787 


1788 


1789 


1790 


1791 



D-6 



Appendix D. Binary-Decimal-Hexadecirnal Conversion Tables 



HEXADECIMAL-DECIMAL INTEGER COlMVERSiOlM (Cont'd) 








1 


2 


3 


4 


5 


6 


7 


8 


9 


A 


B 


C 


D 


E 


F 


700 


1792 


1793 


1794 


1795 


1796 


1797 


17 38 


1799 


1800 


1801 


1802 


1803 


1804 


1805 


1806 


1807 


710 


1808 


1809 


1810 


1811 


1812 


1813 


1814 


1815 


1816 


1817 


1818 


1819 


1820 


1821 


1822 


1823 


7:>o 


1824 


1825 


1826 


1827 


1828 


1829 


1R30 


1831 


1832 


1833 


1834 


1835 


1836 


1837 


1838 


1839 


730 


1840 


1841 


1842 


1843 


1844 


1845 


1fr»6 


1847 


1848 


1849 


1850 


1851 


1852 


1853 


1854 


1855 


740 


1856 


1857 


1858 


1859 


1860 


1861 


18(32 


1863 


1864 


1865 


1866 


1867 


1868 


1869 


1870 


1871 


7«>0 


1872 


1873 


1874 


1875 


1876 


1877 


1878 


1879 


1880 


1881 


1882 


1883 


1884 


1885 


1886 


1887 


760 


1888 


1889 


1890 


1891 


1892 


1893 


18!)4 


1895 


1896 


1897 


1898 


1899 


1900 


1901 


1902 


1903 


770 


1904 


1905 


1906 


1907 


1908 


1909 


1910 


1911 


1912 


1913 


1914 


1915 


1916 


1917 


1918 


1919 


780 


1920 


1921 


1922 


1923 


1924 


1925 


19:?6 


1927 


1928 


1929 


1930 


1931 


1932 


1933 


1934 


1935 


790 


1936 


1937 


1938 


1939 


1940 


1941 


19-12 


1943 


1944 


1945 


1946 


1947 


1948 


1949 


1950 


1951 


7A0 


1952 


1953 


1954 


1955 


1956 


1957 


19!J8 


1959 


1960 


1961 


1962 


1963 


1964 


1965 


1966 


1967 


780 


1968 


1969 


1970 


1971 


1972 


1973 


19'4 


1975 


1976 


1977 


1978 


1979 


1980 


1981 


1982 


1983 


7C0 


1984 


1985 


1986 


1987 


1988 


1989 


19iK) 


1991 


1992 


1993 


1994 


1995 


1996 


1997 


1998 


1999 


7 DO 


2000 


2001 


2002 


2003 


2004 


2005 


2006 


2007 


2008 


2009 


2010 


2011 


2012 


2013 


2014 


2015 


7E0 


2016 


2017 


2018 


2019 


2020 


2021 


20;?2 


2023 


2024 


2025 


2026 


2027 


2028 


2029 


2030 


2031 


7F0 


2032 


2033 


2034 


2035 


2036 


2037 


2038 


2039 


2040 


2041 


2iM2 


2043 


2044 


2045 


2046 


2047 


8(X) 


2048 


2049 


2050 


2051 


2052 


2053 


20!i4 


2055 


2056 


2057 


?D58 


2059 


2060 


2061 


2062 


2063 


810 


2064 


2065 


2066 


2067 


2068 


2069 


20'0 


2071 


2072 


2073 


2074 


2075 


2076 


2077 


2078 


2079 


820 


2080 


2081 


2082 


2083 


2084 


2085 


201)6 


2087 


2088 


2089 


2090 


2091 


2092 


2093 


2094 


2095 


830 


2096 


2097 


2098 


2099 


2100 


2101 


2102 


2103 


2104 


2105 


2106 


2107 


2108 


2109 


2110 


2111 


8^10 


2112 


2113 


2114 


2115 


2116 


2117 


21 18 


2119 


2120 


2121 


2122 


2123 


2124 


2125 


2126 


2127 


8M 


2128 


2129 


2130 


2131 


2132 


2133 


2134 


2135 


2136 


2137 


2138 


2139 


2140 


2141 


2142 


2143 


8<50 


2144 


2145 


2146 


2147 


2148 


2149 


21!iO 


2151 


2152 


2153 


2154 


2155 


2156 


2157 


2158 


2159 


870 


2160 


2161 


2162 


2163 


2164 


2165 


2166 


2167 


2168 


2169 


2170 


2171 


2172 


2173 


2174 


2175 


880 


2176 


2177 


2178 


2179 


2180 


2181 


21!)2 


2183 


2184 


2185 


2186 


2187 


2188 


2189 


2190 


2191 


8iX) 


2192 


2193 


2194 


2195 


2196 


2197 


21!)8 


2199 


2200 


2201 


2202 


2203 


2204 


2205 


2206 


2207 


8A0 


2208 


2209 


2210 


2211 


2212 


2213 


2214 


2215 


2216 


2217 


2218 


2219 


2220 


2221 


2222 


2223 


8B0 


2224 


2225 


2226 


2227 


2228 


2229 


2230 


2231 


2232 


2233 


2234 


2235 


2236 


2237 


2238 


2239 


8C0 


2240 


2241 


2242 


2243 


2244 


2245 


2246 


2247 


2248 


2249 


2250 


2251 


2252 


2253 


2254 


2255 


8 DO 


2256 


2257 


2258 


2259 


2260 


2261 


22(52 


2263 


2264 


2265 


2266 


2267 


2268 


2269 


2270 


2271 


8E0 


2272 


2273 


2274 


2275 


2276 


2277 


22'8 


2279 


2280 


2281 


2282 


2283 


2284 


2285 


2286 


2287 


8F0 


2288 


2289 


2290 


2291 


2292 


2293 


22IM 


2295 


2296 


2297 


2298 


2299 


2300 


2301 


2302 


2303 


9<XI 


2304 


2305 


2306 


2307 


2308 


2309 


2310 


2311 


2312 


2313 


2314 


2315 


2316 


2317 


2318 


2319 


910 


2320 


2321 


2322 


2323 


2324 


2325 


2326 


2327 


2328 


2329 


2330 


2331 


2332 


2333 


2334 


2335 


920 


2336 


2337 


2338 


2339 


2340 


2341 


2342 


2343 


2344 


2345 


2346 


2347 


2348 


2349 


2350 


2351 


930 


2352 


2353 


2354 


2355 


2356 


2357 


23 '58 


2359 


2360 


2361 


2362 


2363 


2364 


2365 


2366 


2367 


940 


2368 


2369 


2370 


2371 


2372 


2373 


23 74 


2375 


2376 


2377 


2378 


2379 


2380 


2381 


2382 


2383 


950 


2384 


2385 


2386 


2387 


2388 


2389 


2390 


2391 


2392 


2393 


2394 


2395 


2396 


2397 


2398 


2399 


960 


2400 


2401 


2402 


2403 


2404 


2405 


24 D6 


2407 


2408 


2409 


2410 


2411 


2412 


2413 


2414 


2415 


970 


2416 


2417 


2418 


2419 


2420 


2421 


2422 


2423 


2424 


2425 


2426 


2427 


2428 


2429 


2430 


2431 


980 


2432 


2433 


2434 


2435 


2436 


2437 


2438 


2439 


2440 


2441 


2442 


2443 


2444 


2445 


2446 


2447 


990 


2448 


2449 


2450 


2451 


2452 


2453 


2454 


2455 


2456 


2457 


2458 


2459 


2460 


2461 


2462 


2463 


9A0 


2464 


2465 


2466 


2467 


2468 


2469 


2470 


2471 


2472 


2473 


2474 


2475 


2476 


2477 


2478 


2479 


9B0 


2480 


2481 


2482 


2483 


2484 


2485 


2486 


2487 


2488 


2489 


2490 


2491 


2492 


2493 


2494 


2495 


9C0 


2496 


2497 


2498 


2499 


2500 


2501 


2502 


2503 


2504 


2505 


2506 


2507 


2508 


2509 


2510 


2511 


9D0 


2512 


2513 


2514 


2515 


2516 


2517 


2518 


2519 


2520 


2521 


2522 


2523 


2524 


2525 


2526 


2527 


9E0 


2528 


2529 


2530 


2531 


2532 


2533 


2534 


2535 


2536 


2537 


2538 


2539 


2540 


2541 


2542 


2543 


9F0 


2544 


2545 


2546 


2547 


2548 


2549 


2550 


2551 


2552 


2553 


2554 


2555 


2556 


2557 


2558 


2559 



D-7 



Appendix D. Binary-Decimal-Hexadecimal Conversion Table< 



HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd) 



AOO 
A10 
A20 
A30 

A40 
ABO 
A60 
A70 

A80 
A90 
AAO 
ABO 

ACQ 
ADO 
AEO 
AFO 



BOO 
BIO 
B20 
B30 

B40 
B50 
860 
B70 

B80 
B90 
BAO 
BBO 

BCO 
BDO 
BEO 
BFO 



COO 
CIO 
C20 
C30 

C40 
C50 
C60 
C70 

C80 
C90 
CAO 
CBO 

ceo 

CDO 
CEO 
CFO 



1 



8 



B 



2560 2561 2562 2563 

2576 2577 2578 2579 

2592 2593 2594 2595 

2608 2609 2610 2611 

2624 2625 2626 2627 

2640 2641 2642 2643 

2656 2657 2658 2659 

2672 2673 2674 2675 

2688 2689 2690 2691 

2704 2705 2706 2707 

2720 2721 2722 2723 

2736 2737 2738 2739 

2752 2753 2754 2755 

2768 2769 2770 2771 

2784 2785 2786 2787 

2800 2801 2802 2803 



2816 2817 2818 2819 

2832 2833 2834 2835 

2848 2849 2850 3851 

2864 2865 2866 2867 

2880 2881 2882 2883 

2896 2897 2898 2899 

2912 2913 2914 2915 

2928 2929 2930 2931 

2944 2945 2946 2947 

2960 2961 2962 2963 

2976 2977 2978 2979 

2992 2993 2994 2995 

3008 3009 3010 3011 

3024 3025 3026 3027 

3040 3041 3042 3043 

3056 3057 30:.8 3059 



3072 3073 3074 3075 

3088 3089 3090 3091 

3104 3105 3106 3107 

3120 3121 3122 3123 

3136 3137 3138 3139 

3152 3153 3154 3155 

3168 3169 3170 3171 

3184 3185 3186 3187 

3200 3201 3202 3203 

3216 3217 3218 3219 

3232 3233 3234 3235 

3248 3249 3250 3251 

3264 3265 3266 3267 

3280 3281 3282 3283 

3296 3297 3298 3299 

3312 3313 3314 3315 



2564 2565 ::566 2567 

2580 2581 :!582 2583 

2596 2597 2598 2599 

2612 2613 ;.'614 2615 

2628 2629 ;?630 2631 

2644 2645 :?646 2647 

2660 2661 2662 2663 

2676 2677 2678 2679 

2692 2693 2694 2695 

2708 2709 2710 2711 

2724 2725 2726 2727 

2740 2741 2742 2743 

2756 2757 2758 2759 

2772 2773 2774 2775 

2738 2789 2790 2791 

2804 2805 2806 2807 



2820 2821 2822 2823 

2836 2837 2838 2839 

2852 2853 2854 2855 

2868 2869 2870 2871 

2884 2885 2866 2887 

2900 2901 2902 2903 

2916 2917 2918 2919 

2932 2933 2934 2935 

2948 2949 2950 2951 

2964 2965 2966 2967 

2980 2981 2982 2983 

2996 2997 2998 2999 

3012 3013 3014 3015 

3028 3029 3030 3031 

3044 3045 3046 3047 

3060 3061 3062 3063 



3076 3077 3078 3079 

3092 3093 3094 3095 

3108 3109 3110 3111 

3124 3125 3126 3127 

3140 3141 3142 3143 

3156 3157 3158 3159 

3172 3173 3174 3175 

3188 3189 3190 3191 

3204 3205 3206 3207 

3220 3221 3222 3223 

3236 3237 3238 3239 

3252 3253 3254 3255 

3268 3269 3270 3271 

3284 3285 3286 3287 

3300 3301 3302 3303 

3316 3317 3318 3319 



2568 2569 2570 2571 

2584 2585 2586 2587 

2600 2601 2602 2603 

2616 2617 2618 2619 

2632 2633 2634 2635 

2648 2649 2650 2651 

2664 2665 2666 2667 

2680 2681 2682 2683 

2696 2697 2698 2699 

2712 2713 2714 2715 

2728 2729 2730 2731 

2744 2745 2746 2747 

2760 4761 2762 2763 

2776 2777 2778 2779 

2792 2793 2794 2795 

2808 2809 2810 2811 



2824 2825 2826 2827 

2840 2841 2842 2843 

2856 2857 2858 2859 

2872 2873 2874 2875 

2888 2889 2890 2891 

2904 2905 2906 2907 

2920 2921 2922 2923 

2936 2937 2938 2939 

2952 2953 2954 2955 

2968 2969 2970 2971 

2984 2985 2986 2987 

3000 3001 3002 3003 

3016 3017 3018 3019 

3032 3033 3034 3035 

3048 3049 3050 3051 

3064 3065 3066 3067 



3080 3081 3082 3083 

3096 3097 3098 3099 

3112 3113 3114 3115 

3128 3129 3130 3131 

3144 3145 3146 3147 

3160 3161 3162 3163 

3176 3177 3178 3179 

3192 3193 3194 3195 

3208 3209 3210 3211 

3224 3225 3226 3227 

3240 3241 3242 3243 

3256 3257 3258 3259 

3272 3273 3274 3275 

3288 3289 3290 3291 

3304 3305 3306 3307 

3320 3321 3322 3323 



2572 2573 2574 2575 

2588 2589 2590 2591 

2604 2605 2606 2607 

2620 2621 2622 2623 

2636 2637 2638 2639 

2652 2653 2654 2655 

2668 2669 2670 2671 

2684 2685 2686 2687 

2700 2701 2702 2703 

2716 2717 2718 2719 

2732 2733 2734 2735 

2748 2749 2750 2751 

2764 2765 2766 2767 

2780 2781 2782 2783 

2796 2797 2798 2799 

2812 2813 2814 2815 



2828 2829 2830 2831 

2844 2845 2846 2847 

2860 2861 2862 2863 

2876 2877 2878 2879 

2892 2893 2894 2895 

2908 2909 2910 2911 

2924 2925 2926 2927 

2940 2941 2942 2943 

2956 2957 2958 2959 

2972 2973 2974 2975 

2988 2989 2990 2991 

3004 3005 3006 3007 

3020 3021 3022 3023 

3036 3037 3038 3039 

3052 3053 3054 3055 

3068 3069 3070 3071 



3084 3085 3086 3087 

3100 3101 3102 3103 

3116 3117 3118 3119 

3132 3133 3134 3135 

3148 3149 3150 3151 

3164 3165 3166 3167 

3180 3181 3182 3183 

3196 3197 3198 3199 

3212 3213 3214 3215 

3228 3229 3230 3231 

3244 3245 3246 3247 

3260 3261 3262 3263 

3276 3277 3278 3279 

3292 3293 3294 3295 

3308 3309 3310 3311 

3324 3325 3326 3327 



D-8 



Appendix D. Binary-Decimal-Hexadecimal Conversion Tables 



HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd) 








1 


2 


3 


4 


5 


6 


7 


8 


9 


A 


B 


C 


D 


E 


F 


DOO 


3328 


3329 


3330 


3331 


3332 


3333 


3334 


3335 


3336 


3337 


3338 


3339 


3340 


3341 


3342 


3343 


D10 


3344 


3345 


3346 


3347 


3348 


3349 


3350 


3351 


3352 


3353 


3354 


3355 


3356 


3357 


3358 


3359 


D20 


3360 


3361 


3362 


3363 


3364 


3365 


3366 


3367 


3368 


3369 


3370 


3371 


3372 


3373 


3374 


3375 


D30 


3376 


3377 


3378 


3379 


3380 


3381 


3382 


3383 


3384 


3385 


3386 


3387 


3388 


3389 


3390 


3391 


D40 


3392 


3393 


3394 


3395 


3396 


3397 


3398 


3399 


3400 


3401 


3402 


3403 


3404 


3405 


3406 


3407 


D50 


3408 


3409 


3410 


3411 


3412 


3413 


3414 


3415 


3416 


3417 


3418 


3419 


3420 


3421 


3422 


3423 


D60 


3424 


3425 


3426 


3427 


3428 


3429 


3430 


3431 


3432 


3433 


3434 


3435 


3436 


3437 


3438 


3439 


D70 


3440 


3441 


3442 


3443 


3444 


3445 


3446 


3447 


3448 


3449 


3450 


3451 


3452 


3453 


3454 


3455 


D80 


3456 


3457 


3458 


3459 


3460 


3461 


3462 


3463 


3464 


3465 


3466 


3467 


3468 


3469 


3470 


3471 


D90 


3472 


3473 


3474 


3475 


3476 


3477 


3478 


3479 


3480 


3481 


3482 


3483 


3484 


3485 


3486 


3487 


DAO 


3488 


3489 


3490 


3491 


3492 


3493 


3494 


3495 


3496 


3497 


3498 


3499 


3500 


3501 


3502 


3503 


DBO 


3504 


3505 


3506 


3507 


3508 


3509 


3510 


3511 


3512 


3513 


3514 


3515 


3516 


3517 


3518 


3519 


DCO 


3520 


3521 


3522 


3523 


3524 


3525 


3526 


3527 


3528 


3529 


3530 


3531 


3532 


3533 


3534 


3535 


DDO 


3536 


3537 


3538 


3539 


3540 


3541 


3542 


3543 


3544 


3545 


3546 


3547 


3548 


3549 


3550 


3551 


DEO 


3552 


3553 


3554 


3555 


3556 


3557 


355B 


3559 


3560 


3561 


3562 


3563 


3564 


3565 


3566 


3567 


DFO 


3568 


3569 


3570 


3571 


3572 


3573 


3574 


3575 


3576 


3577 


3578 


3579 


3580 


3581 


3582 


3583 


EOO 


3584 


3585 


3586 


3587 


3588 


3589 


3593 


3591 


3592 


3593 


3594 


3595 


3596 


3597 


3598 


3599 


E10 


3600 


3601 


3602 


3603 


3604 


3605 


3603 


3607 


3608 


3609 


3610 


3611 


3612 


3613 


3614 


3615 


E20 


3616 


3617 


3618 


3619 


3620 


3621 


3622 


3623 


3624 


3625 


3626 


3627 


3628 


3629 


3630 


3631 


E30 


3632 


3633 


3634 


3635 


3636 


3637 


3633 


3639 


3640 


3641 


3642 


3643 


3644 


3645 


3646 


3647 


E40 


3648 


3649 


3650 


3651 


3652 


3653 


3654 


3655 


3656 


3657 


3658 


3659 


3660 


3661 


3662 


3663 


E50 


3664 


3665 


3666 


3667 


3668 


3669 


3673 


3671 


3672 


3673 


3674 


3675 


3676 


3677 


3678 


3679 


E60 


3680 


3681 


3682 


3683 


3684 


3685 


3683 


3687 


3688 


3689 


3690 


3691 


3692 


3693 


3694 


3695 


E70 


3696 


3697 


3698 


3699 


3700 


3701 


3702 


3703 


3704 


3705 


3706 


3707 


3708 


3709 


3710 


3711 


E80 


3712 


3713 


3714 


3715 


3716 


3717 


3713 


3719 


3720 


3721 


3722 


3723 


3724 


3725 


3726 


3727 


E90 


3728 


3729 


3730 


3731 


3732 


3733 


3734 


3735 


3736 


3737 


3738 


3739 


3740 


3741 


3742 


3743 


EAO 


3744 


3745 


3746 


3747 


3748 


3749 


3753 


3751 


3752 


3753 


3754 


3755 


3756 


3757 


3758 


3759 


EBO 


3760 


3761 


3762 


3763 


3764 


3765 


3765 


3767 


3768 


3769 


3770 


3771 


3772 


3773 


3774 


3775 


ECO 


3776 


3777 


3778 


3779 


3780 


3781 


3782 


3783 


3784 


3785 


3786 


3787 


3788 


3789 


3790 


3791 


EDO 


3792 


3793 


3794 


3795 


3796 


3797 


3798 


3799 


3800 


3801 


3802 


3803 


3804 


3805 


3806 


3807 


EEO 


3808 


3809 


3810 


3811 


3812 


3813 


3814 


3815 


3816 


3817 


3818 


3819 


3820 


3821 


3822 


3823 


EFO 


3824 


3825 


3826 


3827 


3828 


3829 


3830 


3831 


3832 


3833 


3834 


3835 


3836 


3837 


3838 


3839 


FOO 


3840 


3841 


3842 


3843 


3844 


3845 


3846 


3847 


3848 


3849 


3850 


385 1v 


3852 


3853 


3854 


3855 


FIO 


3856 


3857 


3858 


3859 


3860 


3861 


3862 


3863 


3864 


3865 


3866 


3867 


3868 


3869 


3870 


3871 


F20 


3872 


3873 


3874 


387 5 


3876 


3877 


3878 


3879 


3880 


3881 


3882 


3883 


3884 


3885 


3886 


3887 


F30 


3888 


3889 


3890 


3891 


3892 


3893 


3894 


3895 


3896 


3897 


3898 


3899 


3900 


3901 


3902 


3903 


F40 


3904 


3905 


3906 


3907 


3908 


3909 


3910 


3911 


3912 


3913 


3914 


3915 


3916 


3917 


3918 


3919 


F50 


3920 


3921 


3922 


3923 


3924 


3925 


3926 


3927 


3928 


3929 


3930 


3931 


3932 


3933 


3934 


3935 


F60 


3936 


3937 


3938 


3939 


3940 


3941 


3942 


3943 


3944 


3945 


3946 


3947 


3948 


3949 


3950 


3951 


F70 


3952 


3953 


3954 


3955 


3956 


3957 


3958 


3959 


3960 


3961 


3962 


3963 


3964 


3965 


3966 


3967 


F80 


3968 


3969 


3970 


3971 


3972 


3973 


3974 


3975 


3976 


3977 


3978 


3979 


3980 


3981 


3982 


3983 


F90 


3984 


3985 


3986 


3987 


3988 


3989 


3990 


3991 


3992 


3993 


3994 


3995 


3996 


3997 


3998 


3999 


FAO 


4000 


4001 


4002 


4003 


4004 


4005 


4006 


4007 


4008 


4009 


4010 


4011 


4012 


4013 


4014 


4015 


FBO 


4016 


4017 


4018 


4019 


4020 


4021 


4022 


4023 


4024 


4025 


4026 


4027 


4028 


4029 


4030 


4031 


FCO 


4032 


4033 


4034 


4035 


4036 


4037 


4038 


4039 


4040 


4041 


4042 


4043 


4044 


4045 


4046 


4047 


FDO 


4048 


4049 


4050 


4051 


4052 


4053 


4054 


4055 


4056 


4057 


4058 


4059 


4060 


4061 


4062 


4063 


FEO 


4064 


4065 


4066 


4067 


4068 


4069 


4070 


4071 


4072 


4073 


4074 


4075 


4076 


4077 


4078 


4079 


FFO 


4080 


4081 


4082 


4083 


4084 


4085 


4086 


4087 


4088 


4089 


4090 


4091 


4092 


4093 


4094 


4095 



D-9 



INDEX 



Absolute symbols 2-11,2-16 

Accumulator 1-6, 1-7 

Accumulator Instructions '-'9 

AC! instruction 3-2 

ADC Instruction 3-2 

ADD Instruction 3-4 

AD! Instruction 3-5 

Addressing Modes J-J5 

Addressing Registers 1-7 

ANA (AND) Instruction 3-6 

AND Operator 2-13 

ANI (AND Immediate) Instruction 3-7 

Arithmetic Expression Operators 2-12 

Arithmetic Instructions '"'7 

ASCII Constant 2-6 

ASEG (Absolute Segment) Directive 4-14 

Assembler, Need for 1-3 

Assembler Character Set 2-1 

Assembler Compared with PL/M 1-3 

Assembler Function 1-1 

Assembler Termination 4-10 

Assembly-Time Expression Evaluation 2-11 

Auxiliary Carry Flag /-// 

Auxiliary Carry Flag Setting - 8080/8085 Differences 1-12 

Binary Data (Coding Rules) 2-6 

blank (character) 2-3 

Branching Instructions 1-18, 1-22 

Branch Table ' 6-1 

Byte Isolation Operations 2-14 

CALL Instruction 3-8 

Carry Flag 1-10 

CC (Call if Carry) Instruction 3-10 

CM (Call if Minus) Instruction 3-10 

CMA (Complement Accumulator) Instruction 3-11 

CMC (Complement Carry) Instruction 3-12 

CMP (Compare) Instruction 3-12 

CNC (Call if no carry) Instruction 3-14 

CNZ (Call if not Zero) Instruction 3-14 

Combined Addressing Modes ''-'6 

Comment Field 2-4 

Compare Operators 2-13 

Comparing Complemented Data 2-8 

Comparisons in Expressions 2-13 

Complement Used for Subtraction 2-7 

Complemented Data 2-8 

Concatenation 5-10,5-11,5-15,5-16 



1-1 



Condilion Flags 1-9 

Condilional Assembly 4-8 

CP (Call if Positive) Instruction 3-/5 

CPE (Call if Parity Even) Instruction 3-16 

CPI (Compare Immediate) Instruction 3-16 

CPO (Call if Parity Odd) Instruction 3-17 

CSEG (Code Segment) Directive 4-15 

CZ (Call if Zero) Instruction 3-18 

DAA (Decimal Adjust Accumulator) Instruction 3-18 

DAD (Double Register Add) Instruction 3-20 

Data Access Example ^^-7 

Data Definition 4-3 

Data Description Example 4-6 

Data for Subroutines 6-3 

Data Label 2-5 

Data Transfer Instructions '"'6 

DB (Define Byte) Directive 4-3 

DCR (Decrement) Instruction 3-20 

DCX (Decrement Register Pair) 3-22 

Decimal Addition Routine 6-12 

Decimal Data (Coding Rules) 2-5 

Decimal Subtraction Routine ' 6-14 

Delimiters 2-2 

Dl (Disable Interrupts) Instruction 3-22,3-60 

Direct Addressing 7-75 

Divide (Software Example) 6-9 

Division in Expressions 2-12 

DS (Define Storage) Directive 4-5 

DSEG (Data Segment) Directive 4-75 

Dummy Parameters 5-4 

DW (Define Word) Directive 4-4 

El (Enable Interrupts) Instruction 3-23 

ELSE Directive 4-8 

END Directive 4-JO 

ENDIF Directive 4-8 

ENDM (End Macro) Directive 5-5, 5-6,5-7,5-12 

EOT Directive 4-7 7 

EPROM 1-5 

EQ Operator 2-73 

EQU Directive 4-2 

EXITM (Exit Macro) Directive 5-9 

Expression Evaluation 2-11 

Expression Operators 2-11 

Expressions 2-6 

Expressions, Precedence of Operators 2-75 

Expressions, Range of Values 2-15 

EXTRN Directive 4-17 



1-2 



GE Operator 2-13 

General Purpose Registers 7-7 

GT Operator 2-13 

Hardware Overview 1-5 

Hexadecimal Data (Coding Rules) 2-5 

HIGH Operator 2-14, 3-2, 3-5, 3-7, 404 

HLT (Halt) Instruction 3-24 

IF Directive 4-8 

Immediate Addressing 7-75 

Implied Addressing 7-/5 

IN (Input) Instruction ]-]4, 3-24 

INPAGE Reserved Word 4-14, 4-15 

Input/Output Ports 7-74 

INR (Increment) Instruction 3-25 

Instruction Addressing Modes 7-75 

Instruction Execution 1-9 

Instruction Fetch 1-8 

Instruction Label 2-6 

Instruction Naming Conventions 1-16 

Instruction Set Guide 1-23 

Instruction Summary 1-19, 1-23 

Instruction Timing 3-1 

Instructions as Operands 2-7 

INTE Pin 3-49 

Internal Registers 1-6 

Interrupt Subroutines 7-4 

Interrupts 7-1 

Interrupts (8085) 1-24 

INX (Increment Register Pair) Instructions 3-26 

IRP (Indefinite Repeat) Directive 5-8, 5-12,5-22 

IRPC (Indefinite Repeat Character) 5-8, 5-12,5-17 

JC (Jump if Carry) Instruction 3-26 

JM (jump if Minus) Instruction 3-27 

J MP (Jump) Instruction 3-28 

JNC (Jump if no carry) Instruction 3-28 

JNZ (Jump if not zero) Instruction 3-29 

JP (Jump if Positive) Instruction 3-29 

J PE (Jump if parity Even) 3-30 

JPO (Jump if parity Odd) 3-31 

]Z (Jump if Zero) Instruction 3-32 

Label Field 2-3 

Labels 2-6 

LDA (Load Accumulator Direct) Instruction 3-32 

LDAX (Load Accumulator Indirect) 3-33 



1-3 



LE Operator 2-13 

LIB Program 4-12 

LHLD (Load L Direct) Instruction 3-34 

LINK Program 4-12,4-14,4-15 

Linkage 4-16 

List File 1-1 

LOCAL Directive 5-5 

LOCAL Symbols 5-6 

LOCATE Program 4-12,4-13,4-14,4-19 

Location Counter (Coding Rules) 2-6 

Location Counter Control (Absolute Mode) 4-11 

Location Counter Control (Relocatable Mode) 4-14 

Logical Instructions 7-7 7 

Logical Instructions, Summary 3-6 

Logical Operators 2-13 

LOW Operator 2-14, 3-2, 3-5, 3-7, 4-4 

LT Operator 2-13 

LXI (Load Register Pair Immediate) 3.35 

Macros 5-1 

Macro Calls ^.12 

Macro Definition 54 

MACRO Directive 5.4 

Macro Expansion 5.] 5 

Macro Parameters S-5 

Macros versus Subroutines 5-3 

Manual Programming 1-3 

Memory 1-5 

Memory Management with Relocation 4-12 

Memory Reservation 4-5 

MEMORY Reserved Word 4.79 

MOD Operator 2-12 

Modular Programming 4-12 

MODULE Default Name 4-17 

MOV (Move) Instruction 3-36 

Multibyte Addition Routines 6-11 

Multibyte Subtraction Routine 6-11 

Multiplication in Expressions 2-12 

Multiply (Software Example) 6-7 

MVI (Move Immediate) 3-37 

NAME Directive 4-7§ 

NE Operator _ ^ 

Nested Macro Calls 5.I4 

Nested Macro Definitions 5-12 

Nested Subroutines 3-48 

Nine's Complement 2-7 

NOP (No Operation) Instruction 3.38 



1-4 



NOP via MOV 3-36 

NOT Operator 2-13 

NUL Operator 2-13, 5-11 

Null Macros 5-16 

Null Parameter 5-11 

Object Code 7-2 

Object File M 

Octal Data (Coding Rules) 2-5 

One's Complement 2-7 

Opcode 1-1 

Opcode Field 2-4 

Operand Field 2-4 

Operand Field (Coding Rules) 2-4 

Operands 2-5 

Operators, Expression 2-1 1 

OR Operator 2-13 

ORG (Origin) Directive (Absolute Mode) -^-'^ 

ORG (Origin) Directive (Relocatable Mode) 4-16 

ORA (Inclusive OR) Instruction 3-38 

ORI (Inclusive OR Immediate) 3-40 

OUT Instruction 1-14,3-4/ 

PAGE Reserved Word 4:14, 4-15 

Parity Flag ].]] 

PCHL (Move H & L to Program Counier) Instruction 3-42 

Permanent Symbols 2-11 

PL/M 1-3 

PL/M Compared with Assembler 1-3 

POP Instruction ;^.42 

POP PSW instruction 3.43 

Precedence of Expression Operators 2-15 

Processor Registers 1-9 

Program Counter 1-6 

Program Linkage Directives 4-16 

Program Listing 1-2 

Program Status 1-13 

Program Status Word (PSW) 1-14 

Programming the 8085 1-24 

PROM 1-5 

PSW 1-14, 3-45 

PUBLIC Directive 4-17 

PUSH Instruction 3-44 

PUSH PSW Instruction 3-45 

RAM 1-5 

RAM versus ROM 4-5 

RAL (Rotate Left through Carry) Instrjction 3-45 



1-5 



RAR (Rotate Right through Carry) Instruction 3-46 

RC (Return if Carry) Instruction 3-47 

Redefinable Symbols 2-11 

Register Addressing 1-15 

Register indirect Addressing 1-16 

Register Pair Instructions 1-21 

Register Pairs 1-7 

Relocatability Defined 4-12 

Relocatable Expressions 2-16, 2-19 

Relocatable Symbols 2-11 

Relocation Feature 1-2 

Reserved Symbols 2-9 

RESET Signal 3-24 

RET (Return) Instruction 3-48 

REPT Directive 5-6, 5-12,5-15,5-16,5-17,5-18 

RIM (Read Interrupt Mask) 8085 Instruction 3-48 

RLC (Rotate Accumulator Left) Instruction 3-49 

RM (Return if Minus) Instruction 3-50 

RNC (Return if no Carry) Instruction 3-51 

RNZ (Return if not Zero) Instruction 3-51 

ROM 1-5 

RP (Return if Positive) Instruction 3-52 

RPE (Return if Parity Even) Instruction 3-52 

RPO (Return if Parity Odd) Instruction 3-53 

RRC (Rotate Accumulator Right) Instruction 3-53 

RST (Restart) Instruction 3-54 

RST5.5 3-49, 3-55, 3-59, 3-60 

RST6.5 3-49, 3-55, 3-59, 3-60 

RST7.5 3-49, 3-55, 3-59, 3-60 

RZ (Return if Zero) Instruction 3-55 

Savings Program Status 1-13 

SBB (Subtract with Borrow) Instruction 3-56 

SB! (Subtract Immediate with Borrow) Instruction 3-57 

Scope of Symbols 2-10 

SET Directive 4-3 

Shift Expression Operators 2-12 

Shift Operations in Expressions 2-12 

SHL Operator 2-12 

SHLD (Store H & L Direct) Instruction 3-58 

SHR Operator 2-12 

Sign Flag 1-10 

SIM (Set Interrupt Mask) 8085 Instruction 3-59 

Software Divide Routine 6-7 

Software Multiply Routine 6-7 

Source Code Format 2-1 

Source Line Fields 2-1 

Source Program File 1-1 

SPHL (Move H & L to Stack Pointer) Instruction 3-61 



1-6 



SP (Slack Pointer Register) 3-35 

STA (Store Accumulator Direct) Instruction ^'"' 

Stack '-'2 

Stack and Machine Control Instructions '''" 

Stack Operations ^'^^ 

Stack Pointer '"'^ 

STACK Reserved Word 4-19, 3-35 

Start Execution Address ^"10 

STAX (Store Accumulator Indirect) Instruction ^~^^ 

STC (Set Carry) Instruction 3-63 

STKLN Directive 4-18 

SUB (Subtract) Instruction ^-63 

Subroutine Data ""3 

Subroutines ''.'^< 3-" 

Subroutines versus Macros -''^ 

Subtraction for Comparison 3-12 

SUI (Subtract Immediate) Instruction ^'""^ 

Symbol-Cross-Refcrence File ^''> ''-' 

Symbol Definition 4-2 

Symbol Table '^"" 

Symbolic Addressing 2-9 

Symbols ^'" 

Symbols, Absolute 2-11 

Symbols (Coding Rules) 2-9 

Symbols, Global 2-10 

Symbols, Limited 2-10 

Symbols, Permanent 2-11 

Symbols, Redefinable 2-11 

Symbols, Relocatable 2-11 

Symbols, Reserved 2-9 

TRAP Interrupt 3-54 

Ten's Complement 2-7 

Testing Relocatable Modules 4-19 

Timing Effects of Addressing Modes 1-16 

TRAP (8085) 3-23 

Two's Complement Data 2-7 

Use of Macros 5-1 

Using Symbols for Data Access 4-7 

Value of Expressions 2-15 

What is a Macros' 5-2 

Word Instructions 1-21 

Word Storage in Memory 4-4 

Work Registers 1-7 



1-7 



XCHG (Exchange H & L with D & E) Instruction 3-65 

XOR Operator 2-J 3 

XRA (Exclusive OR) Instruction 3-66 

XRI (Exclusive OR Immediate) Instruction 3-67 

XTHL (Exchange H & L with Top of Stack) Instruction 3-69 

Zero Flag 7-7/ 

& (ampersand) 5-10 

<> (angle brackets) 5-10 

CR (carriage return character) 2-2 

(colon) 2-2 

, (comma) 2-2 

;; (double semicolon) 5-10 

/ (division) Operator 2-12 

! (exclamation point) 5-10 

HT (horizontal tab character) 2-2 

(minus) Operator 2-12 

* (multiplication) Operator 2-12 

( ) (parentheses) 2-2 

+ (plus) Operator 2-12 

??nnnn Symbols 5-5 

; (semicolon) 2-2 

(single quote) 2-2 

space (character) 2-2 

8080/8085 Differences 7-24 

8085 Features 1-24 

8085 Processor 1-24 

8085 Programming 1-24 



1-8 



Intel 



SOFTWARE PROBLEM REPORT 



SUBMITTED BY: 

Name 



Company- 
Address 



Phone. 



Date. 



FOR INTERNAL USE ONLY 


No. 


Fix Date 


Date 


Vers/System 


Notes 





CHECK ONE ITEM IN EACH CATEGORY 
Product Product Type 

D Software D Monitor 

D iVIanual D Assembler 

D Compiler 



D Simulator 

D Editoi 

D Utility' 

D 



Machine Line 

D 4004/4040 
8008 
8080 
O3000 

O 



System 

O Intellec 

O Timeshare Co. 

O In-House Computer 



Exact Product/Manual Name 

Version Number (If not known, give date of receipt). 



PROBLEM: 



REPLY: 



PROBLEM DOCUMENTATION ATTACHED IS: 



D Output Listing 
D Program Listing 



D Paper Tape Program Source 

D - 



BUSINESS REPLY MAIL 

No Postage Stamp Necessary if Mailed in U.S.A. 



First Class 
Permit No. 1040 
Santa Clara, CA 



Postage will be paid by: 

Intel Corporation 

3065 Bowors Avenue 
Santa Clara, CA 95051 



Attention: MCS Systems Marketing 



Intel 



8080/8085 Assembly Language 

Programming Manual 

9800301C 



REQUEST FOR READER'S COMMENTS 

The Microcomputer Division Technical Publications Department attempts to provide documents that meet the needs of all 
Intel product users. This form lets you participate directly in the documentation process. 

Please restrict your comments to the usability, accuracy, readability, organization, and completeness of this document. 

1. Please specify by page any errors you found in this manual. 



2. Does the document cover the information you expected or required? Please mal<e suggestions for improvement. 



3. Is this the right type of document for your needs? Is it at the right level? What other types of documents are needed? 



4. Did you have any difficulty understanding descriptions or wording? Where? 



5. Please rate this document on a scale of 1 to 10 with 10 being the best rating. 



NAME DATE 

TITLE 



COMPANY NAME/DEPARTMENT. 
ADDRESS 



CITY STATE ZIP CODE 



Please check here if you require a written reply. □ 



WE'D LIKE YOUR COMMENTS . . . 

This document is one of a series describing Intel sottv/are products. Your comments on the back of this form 
will help us produce better software and manuals. E.ach reply will be carefully reviewed by the responsible 
person. All comments and suggestions become the property of Intel Corporation. 



BUSINESS REPLY MAIL 

No Postage Stamp Necessary if Mailed in U.S.A. 



First Class 
Permit No. 1040 
Santa Clara, CA 



Postage will be paid by: 



Intel Corpciration 

3065 Bowers Avenue 
Santa Clara, CA 95051 



Ati!ention: MCD Technical Publications